bootstrapper.cc revision bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8
1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/bootstrapper.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/accessors.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/api-natives.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/code-stubs.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/externalize-string-extension.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/free-buffer-extension.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/gc-extension.h"
13bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/extensions/ignition-statistics-extension.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/statistics-extension.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/trigger-failure-extension.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/heap/heap.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate-inl.h"
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/snapshot/natives.h"
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/snapshot/snapshot.h"
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/wasm/wasm-js.h"
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBootstrapper::Bootstrapper(Isolate* isolate)
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : isolate_(isolate),
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      nesting_(0),
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      extensions_cache_(Script::TYPE_EXTENSION) {}
2944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class Source>
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<String> Bootstrapper::SourceLookup(int index) {
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(0 <= index && index < Source::GetBuiltinsCount());
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = isolate_->heap();
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (Source::GetSourceCache(heap)->get(index)->IsUndefined()) {
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We can use external strings for the natives.
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Vector<const char> source = Source::GetScriptSource(index);
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    NativesExternalStringResource* resource =
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new NativesExternalStringResource(source.start(), source.length());
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We do not expect this to throw an exception. Change this if it does.
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> source_code = isolate_->factory()
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     ->NewExternalStringFromOneByte(resource)
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     .ToHandleChecked();
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Mark this external string with a special map.
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    source_code->set_map(isolate_->heap()->native_source_string_map());
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Source::GetSourceCache(heap)->set(index, *source_code);
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> cached_source(Source::GetSourceCache(heap)->get(index),
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               isolate_);
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Handle<String>::cast(cached_source);
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate Handle<String> Bootstrapper::SourceLookup<Natives>(int index);
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>(
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int index);
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate Handle<String> Bootstrapper::SourceLookup<ExperimentalExtraNatives>(
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int index);
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index);
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::Initialize(bool create_heap_objects) {
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  extensions_cache_.Initialize(isolate_, create_heap_objects);
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const char* GCFunctionName() {
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool flag_given = FLAG_expose_gc_as != NULL && strlen(FLAG_expose_gc_as) != 0;
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return flag_given ? FLAG_expose_gc_as : "gc";
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochv8::Extension* Bootstrapper::free_buffer_extension_ = NULL;
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochv8::Extension* Bootstrapper::gc_extension_ = NULL;
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochv8::Extension* Bootstrapper::externalize_string_extension_ = NULL;
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochv8::Extension* Bootstrapper::statistics_extension_ = NULL;
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochv8::Extension* Bootstrapper::trigger_failure_extension_ = NULL;
77bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochv8::Extension* Bootstrapper::ignition_statistics_extension_ = NULL;
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Bootstrapper::InitializeOncePerProcess() {
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  free_buffer_extension_ = new FreeBufferExtension;
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::RegisterExtension(free_buffer_extension_);
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  gc_extension_ = new GCExtension(GCFunctionName());
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::RegisterExtension(gc_extension_);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  externalize_string_extension_ = new ExternalizeStringExtension;
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::RegisterExtension(externalize_string_extension_);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  statistics_extension_ = new StatisticsExtension;
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::RegisterExtension(statistics_extension_);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  trigger_failure_extension_ = new TriggerFailureExtension;
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::RegisterExtension(trigger_failure_extension_);
90bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  ignition_statistics_extension_ = new IgnitionStatisticsExtension;
91bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  v8::RegisterExtension(ignition_statistics_extension_);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Bootstrapper::TearDownExtensions() {
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete free_buffer_extension_;
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  free_buffer_extension_ = NULL;
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete gc_extension_;
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  gc_extension_ = NULL;
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete externalize_string_extension_;
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  externalize_string_extension_ = NULL;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete statistics_extension_;
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  statistics_extension_ = NULL;
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete trigger_failure_extension_;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  trigger_failure_extension_ = NULL;
106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  delete ignition_statistics_extension_;
107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  ignition_statistics_extension_ = NULL;
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DeleteNativeSources(Object* maybe_array) {
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (maybe_array->IsFixedArray()) {
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FixedArray* array = FixedArray::cast(maybe_array);
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < array->length(); i++) {
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Object* natives_source = array->get(i);
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!natives_source->IsUndefined()) {
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        const NativesExternalStringResource* resource =
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            reinterpret_cast<const NativesExternalStringResource*>(
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                ExternalOneByteString::cast(natives_source)->resource());
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        delete resource;
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
122e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    }
123e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  }
124e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
125e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
126e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::TearDown() {
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(Natives::GetSourceCache(isolate_->heap()));
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap()));
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap()));
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ExperimentalExtraNatives::GetSourceCache(isolate_->heap()));
133e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  extensions_cache_.Initialize(isolate_, false);  // Yes, symmetrical
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Genesis BASE_EMBEDDED {
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          v8::Local<v8::ObjectTemplate> global_proxy_template,
142109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          v8::ExtensionConfiguration* extensions,
143109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          GlobalContextType context_type);
1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  ~Genesis() { }
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate() const { return isolate_; }
147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Factory* factory() const { return isolate_->factory(); }
148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Heap* heap() const { return isolate_->heap(); }
149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> result() { return result_; }
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context() { return native_context_; }
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Creates some basic objects. Used for creating a context from scratch.
1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  void CreateRoots();
1573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Creates the empty function.  Used for creating a context from scratch.
158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<JSFunction> CreateEmptyFunction(Isolate* isolate);
15944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetRestrictedFunctionPropertiesThrower();
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetStrictArgumentsPoisonFunction();
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name);
16344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CreateStrictModeFunctionMaps(Handle<JSFunction> empty);
165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void CreateIteratorMaps(Handle<JSFunction> empty);
166bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void CreateAsyncFunctionMaps(Handle<JSFunction> empty);
1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void CreateJSProxyMaps();
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Make the "arguments" and "caller" properties throw a TypeError on access.
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AddRestrictedFunctionProperties(Handle<Map> map);
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Creates the global objects using the global proxy and the template passed
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in through the API.  We call this regardless of whether we are building a
1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // context from scratch or using a deserialized one from the partial snapshot
1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // but in the latter case we don't use the objects it produces directly, as
1763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // we have to used the deserialized ones that are linked together with the
1773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // rest of the context snapshot.
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> CreateNewGlobals(
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::ObjectTemplate> global_proxy_template,
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSGlobalProxy> global_proxy);
1813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Hooks the given global proxy into the context.  If the context was created
1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // by deserialization then this will unhook the global proxy that was
1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // deserialized, leaving the GC to pick it up.
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void HookUpGlobalProxy(Handle<JSGlobalObject> global_object,
1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         Handle<JSGlobalProxy> global_proxy);
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Similarly, we want to use the global that has been created by the templates
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // passed through the API.  The global from the snapshot is detached from the
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // other objects in the snapshot.
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void HookUpGlobalObject(Handle<JSGlobalObject> global_object);
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The native context has a ScriptContextTable that store declarative bindings
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // made in script scopes.  Add a "this" binding to that table pointing to the
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // global proxy.
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallGlobalThisBinding();
1943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // New context initialization.  Used for creating a context from scratch.
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InitializeGlobal(Handle<JSGlobalObject> global_object,
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Handle<JSFunction> empty_function,
197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        GlobalContextType context_type);
19869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeExperimentalGlobal();
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Depending on the situation, expose and/or get rid of the utils object.
200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void ConfigureUtilsObject(GlobalContextType context_type);
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_FEATURE_INITIALIZATION(id, descr) \
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void InitializeGlobal_##id();
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION)
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION)
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION)
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_FEATURE_INITIALIZATION(promise_extra, "")
209bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_FEATURE_INITIALIZATION(intl_extra, "")
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_FEATURE_INITIALIZATION
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> InstallArrayBuffer(Handle<JSObject> target,
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        const char* name);
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> InstallInternalArray(Handle<JSObject> target,
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          const char* name,
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          ElementsKind elements_kind);
217109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool InstallNatives(GlobalContextType context_type);
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallTypedArray(const char* name, ElementsKind elements_kind,
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         Handle<JSFunction>* fun);
221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool InstallExperimentalNatives();
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallExtraNatives();
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallExperimentalExtraNatives();
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallDebuggerNatives();
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InstallBuiltinFunctionIds();
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallExperimentalBuiltinFunctionIds();
22780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  void InitializeNormalizedMapCaches();
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum ExtensionTraversalState {
2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    UNVISITED, VISITED, INSTALLED
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  class ExtensionStates {
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   public:
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ExtensionStates();
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ExtensionTraversalState get_state(RegisteredExtension* extension);
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    void set_state(RegisteredExtension* extension,
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   ExtensionTraversalState state);
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HashMap map_;
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    DISALLOW_COPY_AND_ASSIGN(ExtensionStates);
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Used both for deserialized and from-scratch contexts to add the extensions
2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // provided.
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtensions(Handle<Context> native_context,
2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                v8::ExtensionConfiguration* extensions);
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallAutoExtensions(Isolate* isolate,
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ExtensionStates* extension_states);
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallRequestedExtensions(Isolate* isolate,
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         v8::ExtensionConfiguration* extensions,
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         ExtensionStates* extension_states);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtension(Isolate* isolate,
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               const char* name,
2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtension(Isolate* isolate,
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               v8::RegisteredExtension* current,
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallSpecialObjects(Handle<Context> native_context);
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool ConfigureApiObject(Handle<JSObject> object,
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          Handle<ObjectTemplateInfo> object_template);
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ConfigureGlobalObjects(
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::ObjectTemplate> global_proxy_template);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Migrates all properties from the 'from' object to the 'to'
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object and overrides the prototype in 'to' with the one from
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 'from'.
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum FunctionMode {
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // With prototype.
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FUNCTION_WITH_WRITEABLE_PROTOTYPE,
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FUNCTION_WITH_READONLY_PROTOTYPE,
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Without prototype.
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FUNCTION_WITHOUT_PROTOTYPE
2786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool IsFunctionModeWithPrototype(FunctionMode function_mode) {
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            function_mode == FUNCTION_WITH_READONLY_PROTOTYPE);
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
28444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> CreateSloppyFunctionMap(FunctionMode function_mode);
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetFunctionInstanceDescriptor(Handle<Map> map,
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     FunctionMode function_mode);
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void MakeFunctionInstancePrototypeWritable();
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> CreateStrictFunctionMap(FunctionMode function_mode,
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      Handle<JSFunction> empty_function);
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetStrictFunctionInstanceDescriptor(Handle<Map> map,
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           FunctionMode function_mode);
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool CallUtilsFunction(Isolate* isolate, const char* name);
29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool CompileExtension(Isolate* isolate, v8::Extension* extension);
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Context> result_;
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context_;
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Function maps. Function maps are created initially with a read only
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // prototype for the processing of JS builtins. Later the function maps are
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // replaced in order to make prototype writable. These are the final, writable
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // prototype, maps.
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> sloppy_function_map_writable_prototype_;
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> strict_function_map_writable_prototype_;
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> strict_poison_function_;
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> restricted_function_properties_thrower_;
31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  BootstrapperActive active_;
3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  friend class Bootstrapper;
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::Iterate(ObjectVisitor* v) {
32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  extensions_cache_.Iterate(v);
3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  v->Synchronize(VisitorSynchronization::kExtensions);
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Bootstrapper::CreateEnvironment(
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MaybeHandle<JSGlobalProxy> maybe_global_proxy,
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template,
328109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    v8::ExtensionConfiguration* extensions, GlobalContextType context_type) {
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate_);
330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template,
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  extensions, context_type);
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> env = genesis.result();
333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (env.is_null() ||
334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      (context_type != THIN_CONTEXT && !InstallExtensions(env, extensions))) {
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<Context>();
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return scope.CloseAndEscape(env);
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object.__proto__ = proto;
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> old_map = Handle<Map>(object->map());
344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> new_map = Map::Copy(old_map, "SetObjectPrototype");
345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(new_map, proto, FAST_PROTOTYPE);
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::MigrateToMap(object, new_map);
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::DetachGlobal(Handle<Context> env) {
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->GetIsolate()->counters()->errors_thrown_per_context()->AddSample(
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->GetErrorsThrown());
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Factory* factory = env->GetIsolate()->factory();
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy()));
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_proxy->set_native_context(*factory->null_value());
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetObjectPrototype(global_proxy, factory->null_value());
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  global_proxy->map()->SetConstructor(*factory->null_value());
359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_track_detached_contexts) {
360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->GetIsolate()->AddDetachedContext(env);
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
36274b3c146906ea120f97974b0e16aec75c17ebf66Andrei Popescu}
36374b3c146906ea120f97974b0e16aec75c17ebf66Andrei Popescu
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstallFunction(Handle<JSObject> target, Handle<Name> property_name,
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     Handle<JSFunction> function, Handle<String> function_name,
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     PropertyAttributes attributes = DONT_ENUM) {
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(target, property_name, function, attributes);
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (target->IsJSGlobalObject()) {
371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function->shared()->set_instance_class_name(*function_name);
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function->shared()->set_native(true);
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
376bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid InstallFunction(Handle<JSObject> target, Handle<JSFunction> function,
377bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     Handle<Name> name,
378bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     PropertyAttributes attributes = DONT_ENUM) {
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallFunction(target, name, function, name_string, attributes);
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
383bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name,
384bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  InstanceType type, int instance_size,
385bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  MaybeHandle<JSObject> maybe_prototype,
386bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  Builtins::Name call,
387bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  bool strict_function_map = false) {
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> call_code(isolate->builtins()->builtin(call));
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype;
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const bool kReadOnlyPrototype = false;
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const bool kInstallConstructor = false;
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return maybe_prototype.ToHandle(&prototype)
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             ? factory->NewFunction(name, call_code, prototype, type,
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    instance_size, kReadOnlyPrototype,
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    kInstallConstructor, strict_function_map)
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             : factory->NewFunctionWithoutPrototype(name, call_code,
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                    strict_function_map);
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name,
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   InstanceType type, int instance_size,
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   MaybeHandle<JSObject> maybe_prototype,
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   Builtins::Name call,
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   PropertyAttributes attributes,
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   bool strict_function_map = false) {
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function =
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateFunction(target->GetIsolate(), name_string, type, instance_size,
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     maybe_prototype, call, strict_function_map);
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallFunction(target, name, function, name_string, attributes);
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return function;
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> InstallFunction(Handle<JSObject> target, const char* name,
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   InstanceType type, int instance_size,
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   MaybeHandle<JSObject> maybe_prototype,
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   Builtins::Name call,
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   bool strict_function_map = false) {
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* const factory = target->GetIsolate()->factory();
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attributes = DONT_ENUM;
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return InstallFunction(target, factory->InternalizeUtf8String(name), type,
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         instance_size, maybe_prototype, call, attributes,
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         strict_function_map);
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
427bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleCreateFunction(Isolate* isolate, Handle<String> name,
428bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                        Builtins::Name call, int len,
429bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                        bool adapt) {
430bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> fun =
431bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize,
432bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     MaybeHandle<JSObject>(), call);
433bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (adapt) {
434bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    fun->shared()->set_internal_formal_parameter_count(len);
435bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } else {
436bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    fun->shared()->DontAdaptArguments();
437bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
438bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  fun->shared()->set_length(len);
439bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return fun;
440bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
441bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
442bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
443bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         Handle<String> name,
444bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         Builtins::Name call, int len,
445bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         bool adapt) {
446bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> fun =
447bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      SimpleCreateFunction(base->GetIsolate(), name, call, len, adapt);
448bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  InstallFunction(base, fun, name, DONT_ENUM);
449bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return fun;
450bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
452bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
453bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         const char* name, Builtins::Name call,
454bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         int len, bool adapt) {
455bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Factory* const factory = base->GetIsolate()->factory();
456bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call,
457bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                               len, adapt);
458bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
459bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
460bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}  // namespace
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::SetFunctionInstanceDescriptor(Handle<Map> map,
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                            FunctionMode function_mode) {
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4;
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Map::EnsureDescriptorSlack(map, size);
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes ro_attribs =
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes roc_attribs =
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AccessorInfo> length =
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::FunctionLengthInfo(isolate(), roc_attribs);
47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  {  // Add length.
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())),
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 length, roc_attribs);
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AccessorInfo> name =
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::FunctionNameInfo(isolate(), ro_attribs);
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  {  // Add name.
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name,
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 roc_attribs);
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AccessorInfo> args =
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::FunctionArgumentsInfo(isolate(), ro_attribs);
48844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  {  // Add arguments.
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(args->name())), args,
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 ro_attribs);
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AccessorInfo> caller =
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::FunctionCallerInfo(isolate(), ro_attribs);
49544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  {  // Add caller.
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(caller->name())),
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 caller, ro_attribs);
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsFunctionModeWithPrototype(function_mode)) {
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) {
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ro_attribs = static_cast<PropertyAttributes>(ro_attribs & ~READ_ONLY);
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> prototype =
505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::FunctionPrototypeInfo(isolate(), ro_attribs);
506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())),
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 prototype, ro_attribs);
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
5096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) {
514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetFunctionInstanceDescriptor(map, function_mode);
516109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  map->set_is_callable();
51844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return map;
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate the map for function instances. Maps are allocated first and their
52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // prototypes patched later, once empty function is created.
52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Functions with this map will not have a 'prototype' property, and
5276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // can not be used as constructors.
5288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Map> function_without_prototype_map =
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_without_prototype_map(
5318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      *function_without_prototype_map);
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate the function map. This map is temporary, used only for processing
53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // of builtins.
53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Later the map is replaced with writable prototype map, allocated below.
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> function_map =
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateSloppyFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE);
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_map(*function_map);
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_with_readonly_prototype_map(
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *function_map);
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The final map for functions. Writeable prototype.
54344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This map is installed in MakeFunctionInstancePrototypeWritable.
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sloppy_function_map_writable_prototype_ =
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateSloppyFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE);
54644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Factory* factory = isolate->factory();
54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> object_name = factory->Object_string();
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSObject> object_function_prototype;
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- O b j e c t ---
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> object_fun = factory->NewFunction(object_name);
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount;
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int instance_size = JSObject::kHeaderSize + kPointerSize * unused;
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Map> object_function_map =
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->NewMap(JS_OBJECT_TYPE, instance_size);
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    object_function_map->SetInObjectProperties(unused);
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInitialMap(object_fun, object_function_map,
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              isolate->factory()->null_value());
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object_function_map->set_unused_property_fields(unused);
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_object_function(*object_fun);
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Allocate a new prototype for the object function.
566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object_function_prototype =
567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        factory->NewJSObject(isolate->object_function(), TENURED);
568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Handle<Map> map = Map::Copy(handle(object_function_prototype->map()),
569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                "EmptyObjectPrototype");
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->set_is_prototype_map(true);
571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object_function_prototype->set_map(*map);
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    native_context()->set_initial_object_prototype(*object_function_prototype);
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // For bootstrapping set the array prototype to be the same as the object
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // prototype, otherwise the missing initial_array_prototype will cause
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // assertions during startup.
577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    native_context()->set_initial_array_prototype(*object_function_prototype);
578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(object_fun, object_function_prototype)
579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        .Assert();
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Allocate the empty function as the prototype for function - ES6 19.2.3
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code(isolate->builtins()->EmptyFunction());
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> empty_function =
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory->NewFunctionWithoutPrototype(factory->empty_string(), code);
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the function map first and then patch the prototype later
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> empty_function_map =
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!empty_function_map->is_dictionary_map());
591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(empty_function_map, object_function_prototype);
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  empty_function_map->set_is_prototype_map(true);
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  empty_function->set_map(*empty_function_map);
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // --- E m p t y ---
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> source = factory->NewStringFromStaticChars("() {}");
59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Script> script = factory->NewScript(source);
599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_type(Script::TYPE_NATIVE);
6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->set_start_position(0);
6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->set_end_position(source->length());
6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->DontAdaptArguments();
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SharedFunctionInfo::SetScript(handle(empty_function->shared()), script);
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Set prototypes for the function maps.
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_function_map(native_context()->sloppy_function_map(),
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                  isolate);
608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_function_without_prototype_map(
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->sloppy_function_without_prototype_map(), isolate);
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_map, empty_function);
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_without_prototype_map, empty_function);
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_map_writable_prototype_, empty_function);
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // ES6 draft 03-17-2015, section 8.2.2 step 12
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  AddRestrictedFunctionProperties(empty_function_map);
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return empty_function;
6183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::SetStrictFunctionInstanceDescriptor(Handle<Map> map,
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                  FunctionMode function_mode) {
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2;
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Map::EnsureDescriptorSlack(map, size);
6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PropertyAttributes rw_attribs =
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PropertyAttributes ro_attribs =
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes roc_attribs =
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         function_mode == FUNCTION_WITH_READONLY_PROTOTYPE ||
635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         function_mode == FUNCTION_WITHOUT_PROTOTYPE);
636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // Add length.
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> length =
638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::FunctionLengthInfo(isolate(), roc_attribs);
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())),
640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 length, roc_attribs);
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  {  // Add name.
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<AccessorInfo> name =
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::FunctionNameInfo(isolate(), roc_attribs);
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name,
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 roc_attribs);
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
64944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsFunctionModeWithPrototype(function_mode)) {
6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Add prototype.
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs =
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                           : ro_attribs;
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> prototype =
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::FunctionPrototypeInfo(isolate(), attribs);
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())),
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 prototype, attribs);
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->AppendDescriptor(&d);
66044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
66344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Creates the %ThrowTypeError% function.
665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic(
666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Builtins::Name builtin_name) {
667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name =
668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("ThrowTypeError"));
669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code(isolate()->builtins()->builtin(builtin_name));
670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function =
671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewFunctionWithoutPrototype(name, code);
672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->shared()->DontAdaptArguments();
673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // %ThrowTypeError% must not have a name property.
675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (JSReceiver::DeleteProperty(function, factory()->name_string())
676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .IsNothing()) {
677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(false);
678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // length needs to be non configurable.
681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> value(Smi::FromInt(function->shared()->length()), isolate());
682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::SetOwnPropertyIgnoreAttributes(
683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      function, factory()->length_string(), value,
684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY))
685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      .Assert();
686257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (JSObject::PreventExtensions(function, Object::THROW_ON_ERROR)
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .IsNothing()) {
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(false);
690257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return function;
69344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
69444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
69544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ECMAScript 5th Edition, 13.2.3
697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetRestrictedFunctionPropertiesThrower() {
698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (restricted_function_properties_thrower_.is_null()) {
699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    restricted_function_properties_thrower_ = GetThrowTypeErrorIntrinsic(
700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kRestrictedFunctionPropertiesThrower);
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return restricted_function_properties_thrower_;
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetStrictArgumentsPoisonFunction() {
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (strict_poison_function_.is_null()) {
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    strict_poison_function_ = GetThrowTypeErrorIntrinsic(
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kRestrictedStrictArgumentsPropertiesThrower);
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return strict_poison_function_;
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Map> Genesis::CreateStrictFunctionMap(
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionMode function_mode, Handle<JSFunction> empty_function) {
717257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetStrictFunctionInstanceDescriptor(map, function_mode);
719109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  map->set_is_callable();
721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(map, empty_function);
722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return map;
723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
72744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate map for the prototype-less strict mode instances.
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> strict_function_without_prototype_map =
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_without_prototype_map(
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *strict_function_without_prototype_map);
73244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
73344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate map for the strict mode functions. This map is temporary, used
73444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // only for processing of builtins.
73544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Later the map is replaced with writable prototype map, allocated below.
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> strict_function_map =
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty);
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_map(*strict_function_map);
73944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The final map for the strict mode functions. Writeable prototype.
74144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This map is installed in MakeFunctionInstancePrototypeWritable.
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  strict_function_map_writable_prototype_ =
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty);
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
746bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Genesis::CreateIteratorMaps(Handle<JSFunction> empty) {
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create iterator-related meta-objects.
748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> iterator_prototype =
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> generator_object_prototype =
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
752bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_initial_generator_prototype(
753bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      *generator_object_prototype);
754bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SetObjectPrototype(generator_object_prototype, iterator_prototype);
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> generator_function_prototype =
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
757bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SetObjectPrototype(generator_function_prototype, empty);
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
759bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(
760bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      generator_function_prototype, factory()->to_string_tag_symbol(),
761bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      factory()->NewStringFromAsciiChecked("GeneratorFunction"),
762bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(generator_function_prototype,
764bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->prototype_string(),
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        generator_object_prototype,
766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
768bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(generator_object_prototype,
769bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->constructor_string(),
770bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        generator_function_prototype,
771bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
772bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(generator_object_prototype,
773bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->to_string_tag_symbol(),
774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->NewStringFromAsciiChecked("Generator"),
775bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
776bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "next",
777bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeNext, 1, true);
778bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "return",
779bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeReturn, 1, true);
780bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "throw",
781bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeThrow, 1, true);
782bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create maps for generator functions and their prototypes.  Store those
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // maps in the native context. The "prototype" property descriptor is
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // writable, non-enumerable, and non-configurable (as per ES6 draft
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // 04-14-15, section 25.2.4.3).
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Generator functions do not have "caller" or "arguments" accessors.
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_generator_function_map =
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::Copy(strict_function_map, "SloppyGeneratorFunction");
791109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  sloppy_generator_function_map->set_is_constructor(false);
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_generator_function_map,
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    generator_function_prototype);
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_sloppy_generator_function_map(
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *sloppy_generator_function_map);
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> strict_generator_function_map =
798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::Copy(strict_function_map, "StrictGeneratorFunction");
799109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  strict_generator_function_map->set_is_constructor(false);
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(strict_generator_function_map,
801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    generator_function_prototype);
802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_strict_generator_function_map(
803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *strict_generator_function_map);
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> object_function(native_context()->object_function());
806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(generator_object_prototype_map, generator_object_prototype);
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_generator_object_prototype_map(
809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *generator_object_prototype_map);
8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
812bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Genesis::CreateAsyncFunctionMaps(Handle<JSFunction> empty) {
813bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // %AsyncFunctionPrototype% intrinsic
814bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSObject> async_function_prototype =
815bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
816bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SetObjectPrototype(async_function_prototype, empty);
817bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
818bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(async_function_prototype,
819bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->to_string_tag_symbol(),
820bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->NewStringFromAsciiChecked("AsyncFunction"),
821bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
822bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
823bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> strict_function_map(
824bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      native_context()->strict_function_without_prototype_map());
825bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> sloppy_async_function_map =
826bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Map::Copy(strict_function_map, "SloppyAsyncFunction");
827bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  sloppy_async_function_map->set_is_constructor(false);
828bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Map::SetPrototype(sloppy_async_function_map, async_function_prototype);
829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_sloppy_async_function_map(*sloppy_async_function_map);
830bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
831bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> strict_async_function_map =
832bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Map::Copy(strict_function_map, "StrictAsyncFunction");
833bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  strict_async_function_map->set_is_constructor(false);
834bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Map::SetPrototype(strict_async_function_map, async_function_prototype);
835bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_strict_async_function_map(*strict_async_function_map);
836bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
837bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
8383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Genesis::CreateJSProxyMaps() {
8393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Allocate the different maps for all Proxy types.
8403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Next to the default proxy, we need maps indicating callable and
8413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // constructable proxies.
8423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_function_map =
8433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy");
8443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_function_map->set_is_constructor(true);
8453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_function_map(*proxy_function_map);
8463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_map =
8483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS);
8493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_map->set_dictionary_map(true);
8503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_map(*proxy_map);
8513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy");
8533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_callable_map->set_is_callable();
8543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_callable_map(*proxy_callable_map);
8553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_callable_map->SetConstructor(native_context()->function_function());
8563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_constructor_map =
8583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Map::Copy(proxy_callable_map, "constructor Proxy");
8593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_constructor_map->set_is_constructor(true);
8603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_constructor_map(*proxy_constructor_map);
8613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void ReplaceAccessors(Handle<Map> map,
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             Handle<String> name,
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             PropertyAttributes attributes,
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             Handle<AccessorPair> accessor_pair) {
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DescriptorArray* descriptors = map->instance_descriptors();
868109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int idx = descriptors->SearchWithCache(map->GetIsolate(), *name, *map);
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  AccessorConstantDescriptor descriptor(name, accessor_pair, attributes);
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  descriptors->Replace(idx, &descriptor);
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::AddRestrictedFunctionProperties(Handle<Map> map) {
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes rw_attribs = static_cast<PropertyAttributes>(DONT_ENUM);
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> thrower = GetRestrictedFunctionPropertiesThrower();
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<AccessorPair> accessors = factory()->NewAccessorPair();
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  accessors->set_getter(*thrower);
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  accessors->set_setter(*thrower);
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReplaceAccessors(map, factory()->arguments_string(), rw_attribs, accessors);
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReplaceAccessors(map, factory()->caller_string(), rw_attribs, accessors);
88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void AddToWeakNativeContextList(Context* context) {
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(context->IsNativeContext());
888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Heap* heap = context->GetIsolate()->heap();
889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  { // NOLINT
891bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    DCHECK(context->next_context_link()->IsUndefined());
892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Check that context is not in the list yet.
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (Object* current = heap->native_contexts_list();
894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch         !current->IsUndefined();
895bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         current = Context::cast(current)->next_context_link()) {
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(current != context);
897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list(),
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               UPDATE_WEAK_WRITE_BARRIER);
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  heap->set_native_contexts_list(context);
903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvoid Genesis::CreateRoots() {
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the native context FixedArray first and then patch the
9083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // closure and extension object later (we need the empty function
9093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // and the global object, but in order to create those, we need the
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // native context).
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context_ = factory()->NewNativeContext();
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddToWeakNativeContextList(*native_context());
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate()->set_context(*native_context());
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Allocate the message listeners object.
9163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    v8::NeanderArray listeners(isolate());
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_message_listeners(*listeners.value());
9193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallGlobalThisBinding() {
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScriptContextTable> script_contexts(
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->script_context_table());
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScopeInfo> scope_info = ScopeInfo::CreateGlobalThisBinding(isolate());
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> closure(native_context()->closure());
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context = factory()->NewScriptContext(closure, scope_info);
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Go ahead and hook it up while we're at it.
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int slot = scope_info->ReceiverContextSlotIndex();
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS);
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set(slot, native_context()->global_proxy());
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScriptContextTable> new_script_contexts =
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ScriptContextTable::Extend(script_contexts, context);
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_script_context_table(*new_script_contexts);
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSGlobalObject> Genesis::CreateNewGlobals(
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template,
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalProxy> global_proxy) {
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The argument global_proxy_template aka data is an ObjectTemplateInfo.
9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // It has a constructor pointer that points at global_constructor which is a
9463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FunctionTemplateInfo.
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The global_proxy_constructor is used to (re)initialize the
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // global_proxy. The global_proxy_constructor also has a prototype_template
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer that points at js_global_object_template which is an
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // ObjectTemplateInfo.
9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // That in turn has a constructor pointer that points at
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_constructor which is a FunctionTemplateInfo.
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_constructor is used to make js_global_object_function
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_function is used to make the new global_object.
9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  //
9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // --- G l o b a l ---
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Step 1: Create a fresh JSGlobalObject.
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> js_global_object_function;
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ObjectTemplateInfo> js_global_object_template;
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!global_proxy_template.IsEmpty()) {
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Get prototype template of the global_proxy_template.
9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<ObjectTemplateInfo> data =
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::Utils::OpenHandle(*global_proxy_template);
9643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<FunctionTemplateInfo> global_constructor =
9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        Handle<FunctionTemplateInfo>(
9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            FunctionTemplateInfo::cast(data->constructor()));
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> proto_template(global_constructor->prototype_template(),
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  isolate());
9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!proto_template->IsUndefined()) {
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      js_global_object_template =
9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          Handle<ObjectTemplateInfo>::cast(proto_template);
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (js_global_object_template.is_null()) {
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = Handle<String>(heap()->empty_string());
977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate()->builtins()->Illegal();
9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<JSObject> prototype =
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory()->NewFunctionPrototype(isolate()->object_function());
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    js_global_object_function = factory()->NewFunction(
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize);
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LookupIterator it(prototype, factory()->constructor_string(),
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      LookupIterator::OWN_SKIP_INTERCEPTOR);
9853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<Object> value = Object::GetProperty(&it).ToHandleChecked();
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(it.IsFound());
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_EQ(*isolate()->object_function(), *value);
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<FunctionTemplateInfo> js_global_object_constructor(
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FunctionTemplateInfo::cast(js_global_object_template->constructor()));
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_global_object_function = ApiNatives::CreateApiFunction(
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate(), js_global_object_constructor, factory()->the_hole_value(),
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ApiNatives::GlobalObjectType);
9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  js_global_object_function->initial_map()->set_is_prototype_map(true);
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  js_global_object_function->initial_map()->set_dictionary_map(true);
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global_object =
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSGlobalObject(js_global_object_function);
10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Step 2: (re)initialize the global proxy object.
10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Handle<JSFunction> global_proxy_function;
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (global_proxy_template.IsEmpty()) {
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = Handle<String>(heap()->empty_string());
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate()->builtins()->Illegal();
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_proxy_function = factory()->NewFunction(
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        name, code, JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize);
10093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<ObjectTemplateInfo> data =
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::Utils::OpenHandle(*global_proxy_template);
10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<FunctionTemplateInfo> global_constructor(
10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            FunctionTemplateInfo::cast(data->constructor()));
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    global_proxy_function = ApiNatives::CreateApiFunction(
1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate(), global_constructor, factory()->the_hole_value(),
1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ApiNatives::GlobalProxyType);
10173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> global_name = factory()->global_string();
10193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  global_proxy_function->shared()->set_instance_class_name(*global_name);
10203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  global_proxy_function->initial_map()->set_is_access_check_needed(true);
1021109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  global_proxy_function->initial_map()->set_has_hidden_prototype(true);
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects
10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return the global proxy.
10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return global_object;
10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::HookUpGlobalProxy(Handle<JSGlobalObject> global_object,
10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                Handle<JSGlobalProxy> global_proxy) {
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set the native context for the global object.
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_object->set_native_context(*native_context());
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_object->set_global_proxy(*global_proxy);
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_proxy->set_native_context(*native_context());
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If we deserialized the context, the global proxy is already
1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // correctly set up. Otherwise it's undefined.
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(native_context()->get(Context::GLOBAL_PROXY_INDEX)->IsUndefined() ||
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         native_context()->global_proxy() == *global_proxy);
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_global_proxy(*global_proxy);
10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) {
1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global_object_from_snapshot(
1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context()->extension()));
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_extension(*global_object);
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_security_token(*global_object);
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TransferNamedProperties(global_object_from_snapshot, global_object);
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TransferIndexedProperties(global_object_from_snapshot, global_object);
1053402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1054402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic void InstallWithIntrinsicDefaultProto(Isolate* isolate,
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             Handle<JSFunction> function,
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             int context_index) {
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Smi> index(Smi::FromInt(context_index), isolate);
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      function, isolate->factory()->native_context_index_symbol(), index, NONE);
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  isolate->native_context()->set(context_index, *function);
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1065402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// This is only called if we are not using snapshots.  The equivalent
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// work in the snapshot case is done in HookUpGlobalObject.
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               Handle<JSFunction> empty_function,
1069109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                               GlobalContextType context_type) {
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // --- N a t i v e   C o n t e x t ---
10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Use the empty function as closure (no scope info).
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_closure(*empty_function);
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_previous(NULL);
10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Set extension and global object.
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_extension(*global_object);
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Security setup: Set the security token of the native context to the global
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // object. This makes the security check between two different contexts fail
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // by default even in case of global object reinitialization.
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_security_token(*global_object);
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = global_object->GetIsolate();
108244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Factory* factory = isolate->factory();
108344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ScriptContextTable> script_context_table =
1085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      factory->NewScriptContextTable();
1086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  native_context()->set_script_context_table(*script_context_table);
1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallGlobalThisBinding();
1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- O b j e c t ---
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> object_name = factory->Object_string();
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_function = isolate->object_function();
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(global_object, object_name, object_function,
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          DONT_ENUM);
1094bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(object_function, factory->assign_string(),
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kObjectAssign, 2, false);
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(object_function, factory->create_string(),
1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kObjectCreate, 2, false);
1099109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertyDescriptor",
1100109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertyDescriptor, 2, false);
1101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertyNames",
1102109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertyNames, 1, false);
1103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertySymbols",
1104109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertySymbols, 1, false);
1105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "is",
1106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectIs, 2, true);
1107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "preventExtensions",
1108bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectPreventExtensions, 1, false);
1109bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "seal",
1110bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectSeal, 1, false);
1111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_define_properties = SimpleInstallFunction(
1113bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "defineProperties",
1114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kObjectDefineProperties, 2, true);
1115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_define_properties(*object_define_properties);
1116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_define_property = SimpleInstallFunction(
1118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, factory->defineProperty_string(),
1119bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kObjectDefineProperty, 3, true);
1120bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_define_property(*object_define_property);
1121bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1122bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_freeze = SimpleInstallFunction(
1123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "freeze", Builtins::kObjectFreeze, 1, false);
1124bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_freeze(*object_freeze);
1125bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1126bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_get_prototype_of = SimpleInstallFunction(
1127bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "getPrototypeOf", Builtins::kObjectGetPrototypeOf,
1128bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        1, false);
1129bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_get_prototype_of(*object_get_prototype_of);
1130bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1131bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_is_extensible = SimpleInstallFunction(
1132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "isExtensible", Builtins::kObjectIsExtensible,
1133bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        1, false);
1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_extensible(*object_is_extensible);
1135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_is_frozen = SimpleInstallFunction(
1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "isFrozen", Builtins::kObjectIsFrozen, 1, false);
1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_frozen(*object_is_frozen);
1139bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_is_sealed = SimpleInstallFunction(
1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "isSealed", Builtins::kObjectIsSealed, 1, false);
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_sealed(*object_is_sealed);
1143bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_keys = SimpleInstallFunction(
1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "keys", Builtins::kObjectKeys, 1, false);
1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_keys(*object_keys);
11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__defineGetter__", Builtins::kObjectDefineGetter, 2,
1150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__defineSetter__", Builtins::kObjectDefineSetter, 2,
1153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
11543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(), "hasOwnProperty",
11553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kObjectHasOwnProperty, 1, true);
1156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__lookupGetter__", Builtins::kObjectLookupGetter, 1,
1158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__lookupSetter__", Builtins::kObjectLookupSetter, 1,
1161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global(native_context()->global_object());
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- F u n c t i o n ---
1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> prototype = empty_function;
1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> function_fun =
1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        prototype, Builtins::kFunctionConstructor);
1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->set_prototype_or_initial_map(
1172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *sloppy_function_map_writable_prototype_);
1173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->shared()->DontAdaptArguments();
1174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->shared()->set_construct_stub(
1175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->FunctionConstructor());
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->shared()->set_length(1);
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, function_fun,
1178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::FUNCTION_FUNCTION_INDEX);
1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Setup the methods on the %FunctionPrototype%.
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->apply_string(),
1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeApply, 2, false);
1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->bind_string(),
1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeBind, 1, false);
1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->call_string(),
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeCall, 1, false);
1187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->toString_string(),
1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeToString, 0, false);
1189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the @@hasInstance function.
1191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> has_instance = InstallFunction(
1192109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        prototype, factory->has_instance_symbol(), JS_OBJECT_TYPE,
1193109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1194bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kFunctionPrototypeHasInstance,
1195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
1196109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Set the expected parameters for @@hasInstance to 1; required by builtin.
1198109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    has_instance->shared()->set_internal_formal_parameter_count(1);
1199109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Set the length for the function to satisfy ECMA-262.
1201109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    has_instance->shared()->set_length(1);
1202109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the "constructor" property on the %FunctionPrototype%.
1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(),
1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          function_fun, DONT_ENUM);
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sloppy_function_map_writable_prototype_->SetConstructor(*function_fun);
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    strict_function_map_writable_prototype_->SetConstructor(*function_fun);
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- A r r a y ---
1212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> array_function =
1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        isolate->initial_object_prototype(),
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        Builtins::kArrayCode);
1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_function->shared()->DontAdaptArguments();
12173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    array_function->shared()->set_builtin_function_id(kArrayCode);
1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // This seems a bit hackish, but we need to make sure Array.length
1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // is 1.
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_function->shared()->set_length(1);
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Map> initial_map(array_function->initial_map());
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // This assert protects an optimization in
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // HGraphBuilder::JSArrayBuilder::EmitMapCode()
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(initial_map->elements_kind() == GetInitialFastElementsKind());
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(initial_map, 1);
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = static_cast<PropertyAttributes>(
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DONT_ENUM | DONT_DELETE);
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> array_length =
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::ArrayLengthInfo(isolate, attribs);
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // Add length.
1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
1237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(array_length->name())), array_length,
1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      initial_map->AppendDescriptor(&d);
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, array_function,
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::ARRAY_FUNCTION_INDEX);
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Cache the array maps, needed by ArrayConstructorStub
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CacheInitialJSArrayMaps(native_context(), initial_map);
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ArrayConstructorStub array_constructor_stub(isolate);
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Code> code = array_constructor_stub.GetCode();
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    array_function->shared()->set_construct_stub(*code);
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> is_arraylike = SimpleInstallFunction(
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        array_function, isolate->factory()->InternalizeUtf8String("isArray"),
1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kArrayIsArray, 1, true);
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_is_arraylike(*is_arraylike);
1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- N u m b e r ---
1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> number_fun = InstallFunction(
1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Number", JS_VALUE_TYPE, JSValue::kSize,
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kNumberConstructor);
1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    number_fun->shared()->DontAdaptArguments();
1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    number_fun->shared()->set_construct_stub(
1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->NumberConstructor_ConstructStub());
1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    number_fun->shared()->set_length(1);
1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, number_fun,
1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::NUMBER_FUNCTION_INDEX);
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- B o o l e a n ---
1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> boolean_fun =
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        isolate->initial_object_prototype(),
1273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        Builtins::kBooleanConstructor);
1274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    boolean_fun->shared()->DontAdaptArguments();
1275109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    boolean_fun->shared()->set_construct_stub(
1276109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        *isolate->builtins()->BooleanConstructor_ConstructStub());
1277109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    boolean_fun->shared()->set_length(1);
1278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, boolean_fun,
1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::BOOLEAN_FUNCTION_INDEX);
1280109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1281109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the %BooleanPrototype%
1282109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSValue> prototype =
1283109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        Handle<JSValue>::cast(factory->NewJSObject(boolean_fun, TENURED));
1284109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    prototype->set_value(isolate->heap()->false_value());
1285109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Accessors::FunctionSetPrototype(boolean_fun, prototype).Assert();
1286109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the "constructor" property on the {prototype}.
1288109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), boolean_fun,
1289109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          DONT_ENUM);
1290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the Boolean.prototype methods.
1292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(prototype, "toString",
1293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kBooleanPrototypeToString, 0, false);
1294109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(prototype, "valueOf",
1295109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kBooleanPrototypeValueOf, 0, false);
1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- S t r i n g ---
1299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> string_fun = InstallFunction(
1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "String", JS_VALUE_TYPE, JSValue::kSize,
1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kStringConstructor);
130280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    string_fun->shared()->set_construct_stub(
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->StringConstructor_ConstructStub());
1304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    string_fun->shared()->DontAdaptArguments();
1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    string_fun->shared()->set_length(1);
1306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, string_fun,
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::STRING_FUNCTION_INDEX);
1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Map> string_map =
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Map>(native_context()->string_function()->initial_map());
1311109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    string_map->set_elements_kind(FAST_STRING_WRAPPER_ELEMENTS);
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(string_map, 1);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = static_cast<PropertyAttributes>(
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DONT_ENUM | DONT_DELETE | READ_ONLY);
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> string_length(
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::StringLengthInfo(isolate, attribs));
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // Add length.
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory->length_string(), string_length,
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   attribs);
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      string_map->AppendDescriptor(&d);
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
13243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
13253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // Install the String.fromCharCode function.
13263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(string_fun, "fromCharCode",
13273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kStringFromCharCode, 1, false);
1328bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1329bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Create the %StringPrototype%
1330bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSValue> prototype =
1331bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Handle<JSValue>::cast(factory->NewJSObject(string_fun, TENURED));
1332bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    prototype->set_value(isolate->heap()->empty_string());
1333bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Accessors::FunctionSetPrototype(string_fun, prototype).Assert();
1334bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1335bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Install the "constructor" property on the {prototype}.
1336bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), string_fun,
1337bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          DONT_ENUM);
1338bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1339bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Install the String.prototype methods.
1340bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(prototype, "charAt", Builtins::kStringPrototypeCharAt,
1341bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          1, true);
1342bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(prototype, "charCodeAt",
1343bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kStringPrototypeCharCodeAt, 1, true);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // --- S y m b o l ---
1348109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSObject> prototype =
1349109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1350109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> symbol_fun =
1351109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
1352109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        prototype, Builtins::kSymbolConstructor);
1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    symbol_fun->shared()->set_construct_stub(
1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->SymbolConstructor_ConstructStub());
13553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    symbol_fun->shared()->set_length(0);
1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    symbol_fun->shared()->DontAdaptArguments();
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_symbol_function(*symbol_fun);
1358109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1359109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the "constructor" property on the {prototype}.
1360109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), symbol_fun,
1361109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          DONT_ENUM);
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- D a t e ---
1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for Date.prototype.
1366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> prototype =
1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> date_fun =
1369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, prototype,
1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Builtins::kDateConstructor);
1371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, date_fun,
1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::DATE_FUNCTION_INDEX);
1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    date_fun->shared()->set_construct_stub(
1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->DateConstructor_ConstructStub());
1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    date_fun->shared()->set_length(7);
1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    date_fun->shared()->DontAdaptArguments();
1377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the Date.now, Date.parse and Date.UTC functions.
1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "now", Builtins::kDateNow, 0, false);
1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "parse", Builtins::kDateParse, 1, false);
1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "UTC", Builtins::kDateUTC, 7, false);
1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the "constructor" property on the {prototype}.
1384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), date_fun,
1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          DONT_ENUM);
1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the Date.prototype methods.
1388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toString",
1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToString, 0, false);
1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toDateString",
1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToDateString, 0, false);
1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toTimeString",
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToTimeString, 0, false);
1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toISOString",
1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToISOString, 0, false);
1396109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> to_utc_string =
1397109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        SimpleInstallFunction(prototype, "toUTCString",
1398109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                              Builtins::kDatePrototypeToUTCString, 0, false);
1399109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    InstallFunction(prototype, to_utc_string,
1400109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                    factory->InternalizeUtf8String("toGMTString"), DONT_ENUM);
1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getDate", Builtins::kDatePrototypeGetDate,
1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setDate", Builtins::kDatePrototypeSetDate,
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getDay", Builtins::kDatePrototypeGetDay,
1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getFullYear",
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetFullYear, 0, true);
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setFullYear",
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetFullYear, 3, false);
1411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getHours",
1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetHours, 0, true);
1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setHours",
1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetHours, 4, false);
1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMilliseconds",
1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMilliseconds, 0, true);
1417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMilliseconds",
1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMilliseconds, 1, false);
1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMinutes",
1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMinutes, 0, true);
1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMinutes",
1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMinutes, 3, false);
1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMonth",
1424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMonth, 0, true);
1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMonth",
1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMonth, 2, false);
1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getSeconds",
1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetSeconds, 0, true);
1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setSeconds",
1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetSeconds, 2, false);
1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getTime", Builtins::kDatePrototypeGetTime,
1432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setTime", Builtins::kDatePrototypeSetTime,
1434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
1435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getTimezoneOffset",
1436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetTimezoneOffset, 0, true);
1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCDate",
1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCDate, 0, true);
1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCDate",
1440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCDate, 1, false);
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCDay",
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCDay, 0, true);
1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCFullYear",
1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCFullYear, 0, true);
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCFullYear",
1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCFullYear, 3, false);
1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCHours",
1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCHours, 0, true);
1449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCHours",
1450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCHours, 4, false);
1451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMilliseconds",
1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMilliseconds, 0, true);
1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMilliseconds",
1454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMilliseconds, 1, false);
1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMinutes",
1456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMinutes, 0, true);
1457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMinutes",
1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMinutes, 3, false);
1459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMonth",
1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMonth, 0, true);
1461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMonth",
1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMonth, 2, false);
1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCSeconds",
1464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCSeconds, 0, true);
1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCSeconds",
1466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCSeconds, 2, false);
1467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "valueOf", Builtins::kDatePrototypeValueOf,
1468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, false);
1469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getYear", Builtins::kDatePrototypeGetYear,
1470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setYear", Builtins::kDatePrototypeSetYear,
1472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
1473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install i18n fallback functions.
1475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleString",
1476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToString, 0, false);
1477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleDateString",
1478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToDateString, 0, false);
1479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleTimeString",
1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToTimeString, 0, false);
1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the @@toPrimitive function.
1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> to_primitive = InstallFunction(
1484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE,
1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kDatePrototypeToPrimitive,
1487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the expected parameters for @@toPrimitive to 1; required by builtin.
1490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_primitive->shared()->set_internal_formal_parameter_count(1);
1491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the length for the function to satisfy ECMA-262.
1493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_primitive->shared()->set_length(1);
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- R e g E x p
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for RegExp.prototype.
1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> regexp_fun =
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
150044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        isolate->initial_object_prototype(),
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        Builtins::kIllegal);
1502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, regexp_fun,
1503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::REGEXP_FUNCTION_INDEX);
1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    regexp_fun->shared()->set_construct_stub(
1505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->JSBuiltinsConstructStub());
15066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(regexp_fun->has_initial_map());
15086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<Map> initial_map(regexp_fun->initial_map());
15096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(0, initial_map->GetInObjectProperties());
15116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(initial_map, 1);
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // ECMA-262, section 15.10.7.5.
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PropertyAttributes writable =
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DataDescriptor field(factory->last_index_string(),
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         JSRegExp::kLastIndexFieldIndex, writable,
1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         Representation::Tagged());
1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->AppendDescriptor(&field);
15216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    static const int num_fields = JSRegExp::kInObjectFieldCount;
1523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetInObjectProperties(num_fields);
15246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_unused_property_fields(0);
1525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    initial_map->set_instance_size(initial_map->instance_size() +
1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                   num_fields * kPointerSize);
1527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- E r r o r
1530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> error_fun = InstallFunction(
1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Error", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, error_fun,
1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::ERROR_FUNCTION_INDEX);
1535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- E v a l E r r o r
1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> eval_error_fun = InstallFunction(
1539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "EvalError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, eval_error_fun,
1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::EVAL_ERROR_FUNCTION_INDEX);
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- R a n g e E r r o r
1546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> range_error_fun = InstallFunction(
1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "RangeError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, range_error_fun,
1550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::RANGE_ERROR_FUNCTION_INDEX);
1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- R e f e r e n c e E r r o r
1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> reference_error_fun = InstallFunction(
1555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "ReferenceError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, reference_error_fun,
1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::REFERENCE_ERROR_FUNCTION_INDEX);
1559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S y n t a x E r r o r
1562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> syntax_error_fun = InstallFunction(
1563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "SyntaxError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, syntax_error_fun,
1566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::SYNTAX_ERROR_FUNCTION_INDEX);
1567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- T y p e E r r o r
1570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> type_error_fun = InstallFunction(
1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "TypeError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, type_error_fun,
1574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::TYPE_ERROR_FUNCTION_INDEX);
1575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- U R I E r r o r
1578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> uri_error_fun = InstallFunction(
1579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "URIError", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, uri_error_fun,
1582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::URI_ERROR_FUNCTION_INDEX);
1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Initialize the embedder data slot.
1586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> embedder_data = factory->NewFixedArray(3);
1587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_embedder_data(*embedder_data);
1588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (context_type == THIN_CONTEXT) return;
1590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- J S O N
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = factory->InternalizeUtf8String("JSON");
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> cons = factory->NewFunction(name);
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInstancePrototype(cons,
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Object>(native_context()->initial_object_prototype(), isolate));
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cons->shared()->set_instance_class_name(*name);
1597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED);
1598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(json_object->IsJSObject());
1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(global, name, json_object, DONT_ENUM);
1600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a t h
1603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> name = factory->InternalizeUtf8String("Math");
1604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> cons = factory->NewFunction(name);
1605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSFunction::SetInstancePrototype(
1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        cons,
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Object>(native_context()->initial_object_prototype(), isolate));
1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cons->shared()->set_instance_class_name(*name);
1609109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSObject> math = factory->NewJSObject(cons, TENURED);
1610109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK(math->IsJSObject());
1611109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(global, name, math, DONT_ENUM);
16123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "acos", Builtins::kMathAcos, 1, true);
16133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "asin", Builtins::kMathAsin, 1, true);
16143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "atan", Builtins::kMathAtan, 1, true);
16153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "ceil", Builtins::kMathCeil, 1, true);
16163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "clz32", Builtins::kMathClz32, 1, true);
16173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> math_floor =
16183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(math, "floor", Builtins::kMathFloor, 1, true);
16193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_math_floor(*math_floor);
16203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "fround", Builtins::kMathFround, 1, true);
16213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "imul", Builtins::kMathImul, 2, true);
1622109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(math, "max", Builtins::kMathMax, 2, false);
1623109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(math, "min", Builtins::kMathMin, 2, false);
16243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "round", Builtins::kMathRound, 1, true);
16253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> math_sqrt =
16263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(math, "sqrt", Builtins::kMathSqrt, 1, true);
16273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_math_sqrt(*math_sqrt);
16283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "trunc", Builtins::kMathTrunc, 1, true);
1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // -- A r r a y B u f f e r
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> array_buffer_fun =
1633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallArrayBuffer(global, "ArrayBuffer");
1634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, array_buffer_fun,
1635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::ARRAY_BUFFER_FUN_INDEX);
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // -- T y p e d A r r a y s
1639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size)             \
1640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                                    \
1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> fun;                                            \
1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallTypedArray(#Type "Array", TYPE##_ELEMENTS, &fun);           \
1643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, fun,                     \
1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::TYPE##_ARRAY_FUN_INDEX); \
1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef INSTALL_TYPED_ARRAY
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1649109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> data_view_fun = InstallFunction(
1650109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        global, "DataView", JS_DATA_VIEW_TYPE,
1651109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JSDataView::kSizeWithInternalFields,
1652109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        isolate->initial_object_prototype(), Builtins::kDataViewConstructor);
1653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, data_view_fun,
1654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::DATA_VIEW_FUN_INDEX);
1655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    data_view_fun->shared()->set_construct_stub(
1656109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        *isolate->builtins()->DataViewConstructor_ConstructStub());
1657109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    data_view_fun->shared()->set_length(3);
1658109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    data_view_fun->shared()->DontAdaptArguments();
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a p
1662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_map_fun = InstallFunction(
1663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Map", JS_MAP_TYPE, JSMap::kSize,
1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_map_fun,
1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_MAP_FUN_INDEX);
1667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S e t
1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_set_fun = InstallFunction(
1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Set", JS_SET_TYPE, JSSet::kSize,
1672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_set_fun,
1674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_SET_FUN_INDEX);
1675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- I t e r a t o r R e s u l t
1678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map =
1679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory->NewMap(JS_OBJECT_TYPE, JSIteratorResult::kSize);
1680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, isolate->initial_object_prototype());
1681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(map, 2);
1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // value
1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor d(factory->value_string(), JSIteratorResult::kValueIndex,
1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       NONE, Representation::Tagged());
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // done
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor d(factory->done_string(), JSIteratorResult::kDoneIndex,
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       NONE, Representation::Tagged());
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1695109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(2);
1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_iterator_result_map(*map);
1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- W e a k M a p
1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_weak_map_fun = InstallFunction(
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_weak_map_fun,
1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_WEAK_MAP_FUN_INDEX);
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- W e a k S e t
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_weak_set_fun = InstallFunction(
1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_weak_set_fun,
1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_WEAK_SET_FUN_INDEX);
1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {  // -- P r o x y
17173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    CreateJSProxyMaps();
17183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<String> name = factory->Proxy_string();
17203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<Code> code(isolate->builtins()->ProxyConstructor());
17213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> proxy_function =
17233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->NewFunction(isolate->proxy_function_map(),
17243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                             factory->Proxy_string(), MaybeHandle<Code>(code));
17253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    JSFunction::SetInitialMap(
17273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        proxy_function, Handle<Map>(native_context()->proxy_map(), isolate),
17283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->null_value());
17293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    proxy_function->shared()->set_construct_stub(
17313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        *isolate->builtins()->ProxyConstructor_ConstructStub());
17323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    proxy_function->shared()->set_internal_formal_parameter_count(2);
17333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    proxy_function->shared()->set_length(2);
17343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_proxy_function(*proxy_function);
17363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    InstallFunction(global, name, proxy_function, factory->Object_string());
17373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
17383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {  // -- R e f l e c t
17403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<String> reflect_string = factory->InternalizeUtf8String("Reflect");
17413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSObject> reflect =
17423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
17433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    JSObject::AddProperty(global, reflect_string, reflect, DONT_ENUM);
17443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> define_property =
17463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->defineProperty_string(),
17473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectDefineProperty, 3, true);
17483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_define_property(*define_property);
17493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> delete_property =
17513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->deleteProperty_string(),
17523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectDeleteProperty, 2, true);
17533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_delete_property(*delete_property);
17543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> apply = SimpleInstallFunction(
17563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        reflect, factory->apply_string(), Builtins::kReflectApply, 3, false);
17573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_apply(*apply);
17583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> construct =
17603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->construct_string(),
17613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectConstruct, 2, false);
17623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_construct(*construct);
17633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->get_string(), Builtins::kReflectGet,
17653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          2, false);
17663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->getOwnPropertyDescriptor_string(),
17673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectGetOwnPropertyDescriptor, 2, true);
17683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->getPrototypeOf_string(),
17693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectGetPrototypeOf, 1, true);
17703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->has_string(), Builtins::kReflectHas,
17713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          2, true);
17723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->isExtensible_string(),
17733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectIsExtensible, 1, true);
17743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->ownKeys_string(),
17753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectOwnKeys, 1, true);
17763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->preventExtensions_string(),
17773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectPreventExtensions, 1, true);
17783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->set_string(), Builtins::kReflectSet,
17793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          3, false);
17803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->setPrototypeOf_string(),
17813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectSetPrototypeOf, 2, true);
17823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
17833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- B o u n d F u n c t i o n
1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map =
1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewMap(JS_BOUND_FUNCTION_TYPE, JSBoundFunction::kSize);
1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_is_callable();
1788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, empty_function);
1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PropertyAttributes roc_attribs =
1791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(map, 2);
1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1794bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<AccessorInfo> bound_length =
1795bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Accessors::BoundFunctionLengthInfo(isolate, roc_attribs);
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // length
1797bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AccessorConstantDescriptor d(factory->length_string(), bound_length,
1798bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                   roc_attribs);
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1801bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<AccessorInfo> bound_name =
1802bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Accessors::BoundFunctionNameInfo(isolate, roc_attribs);
1803bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    {  // length
1804bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AccessorConstantDescriptor d(factory->name_string(), bound_name,
1805bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                   roc_attribs);
1806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
1807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1808bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    map->SetInObjectProperties(0);
1809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_bound_function_without_constructor_map(*map);
1810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "IsConstructor");
1812109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_is_constructor(true);
1813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_bound_function_with_constructor_map(*map);
1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // --- sloppy arguments map
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Make sure we can recognize argument objects at runtime.
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // This is done by introducing an anonymous function with
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // class_name equals 'Arguments'.
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> arguments_string = factory->Arguments_string();
1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->Illegal();
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> function = factory->NewFunctionWithoutPrototype(
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_string, code);
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function->shared()->set_instance_class_name(*arguments_string);
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = factory->NewMap(
1827109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JS_OBJECT_TYPE, JSSloppyArgumentsObject::kSize, FAST_ELEMENTS);
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create the descriptor array for the arguments object.
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(map, 2);
1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // length
1832109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->length_string(),
1833109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSSloppyArgumentsObject::kLengthIndex, DONT_ENUM,
1834109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // callee
1838109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->callee_string(),
1839109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSSloppyArgumentsObject::kCalleeIndex, DONT_ENUM,
1840109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // @@iterator method is added later.
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(2);
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_sloppy_arguments_map(*map);
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!function->has_initial_map());
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInitialMap(function, map,
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              isolate->initial_object_prototype());
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!map->is_dictionary_map());
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsFastObjectElementsKind(map->elements_kind()));
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
185544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- fast and slow aliased arguments map
1857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = isolate->sloppy_arguments_map();
1858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "FastAliasedArguments");
1859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS);
1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(2, map->GetInObjectProperties());
1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_fast_aliased_arguments_map(*map);
1862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "SlowAliasedArguments");
1864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(2, map->GetInObjectProperties());
1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_slow_aliased_arguments_map(*map);
186744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
186844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // --- strict mode arguments map
187044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    const PropertyAttributes attributes =
187144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
187244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
187344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Create the ThrowTypeError functions.
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<AccessorPair> callee = factory->NewAccessorPair();
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<AccessorPair> caller = factory->NewAccessorPair();
187644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> poison = GetStrictArgumentsPoisonFunction();
187844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
187944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Install the ThrowTypeError functions.
1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    callee->set_getter(*poison);
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    callee->set_setter(*poison);
1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    caller->set_getter(*poison);
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    caller->set_setter(*poison);
188444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create the map. Allocate one in-object field for length.
1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = factory->NewMap(
1887109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JS_OBJECT_TYPE, JSStrictArgumentsObject::kSize, FAST_ELEMENTS);
188844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Create the descriptor array for the arguments object.
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(map, 3);
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    {  // length
1892109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->length_string(),
1893109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSStrictArgumentsObject::kLengthIndex, DONT_ENUM,
1894109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
189644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
189744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    {  // callee
1898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory->callee_string(), callee,
1899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   attributes);
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
190144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
190244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    {  // caller
1903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory->caller_string(), caller,
1904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   attributes);
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
190644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // @@iterator method is added later.
190844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK_EQ(native_context()->object_function()->prototype(),
1910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              *isolate->initial_object_prototype());
1911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, isolate->initial_object_prototype());
1912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(1);
191344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Copy constructor from the sloppy arguments boilerplate.
1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetConstructor(
1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context()->sloppy_arguments_map()->GetConstructor());
191744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_strict_arguments_map(*map);
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!map->is_dictionary_map());
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsFastObjectElementsKind(map->elements_kind()));
1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- context extension
1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Create a function for the context extension objects.
1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->Illegal();
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> context_extension_fun = factory->NewFunction(
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE,
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSObject::kHeaderSize);
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = factory->InternalizeOneByteString(
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        STATIC_CHAR_VECTOR("context_extension"));
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    context_extension_fun->shared()->set_instance_class_name(*name);
1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_context_extension_function(*context_extension_fun);
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {
193969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Set up the call-as-function delegate.
1940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->HandleApiCallAsFunction();
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> delegate = factory->NewFunction(
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_call_as_function_delegate(*delegate);
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    delegate->shared()->DontAdaptArguments();
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {
194869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Set up the call-as-constructor delegate.
1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor();
1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> delegate = factory->NewFunction(
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_call_as_constructor_delegate(*delegate);
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    delegate->shared()->DontAdaptArguments();
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // NOLINT(readability/fn_size)
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind,
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                Handle<JSFunction>* fun) {
1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> result = InstallFunction(
1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize,
1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->initial_object_prototype(), Builtins::kIllegal);
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> initial_map = isolate()->factory()->NewMap(
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JS_TYPED_ARRAY_TYPE,
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSTypedArray::kSizeWithInternalFields,
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      elements_kind);
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSFunction::SetInitialMap(result, initial_map,
1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            handle(initial_map->prototype(), isolate()));
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  *fun = result;
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Genesis::InitializeExperimentalGlobal() {
1976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
1979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
1980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
1981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FEATURE_INITIALIZE_GLOBAL(promise_extra, "")
1982bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  FEATURE_INITIALIZE_GLOBAL(intl_extra, "")
1983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef FEATURE_INITIALIZE_GLOBAL
198469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
198569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
198669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) {
1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Vector<const char> name = Natives::GetScriptName(index);
198944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> source_code =
1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<Natives>(index);
1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We pass in extras_utils so that builtin code can set it up for later use
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // by actual extras code, compiled with CompileExtraBuiltin.
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> utils = isolate->natives_utils_object();
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, utils, extras_utils};
1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2000109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, NATIVES_CODE);
2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2002257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2003257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExperimentalBuiltin(Isolate* isolate, int index) {
2005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2006257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Vector<const char> name = ExperimentalNatives::GetScriptName(index);
2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index);
2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> utils = isolate->natives_utils_object();
2011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, utils};
2012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2013109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, NATIVES_CODE);
2014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) {
2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = ExtraNatives::GetScriptName(index);
2020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExtraNatives>(index);
2022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> binding = isolate->extras_binding_object();
2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
2025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, binding, extras_utils};
2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2027109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, EXTENSION_CODE);
2028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExperimentalExtraBuiltin(Isolate* isolate,
2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                   int index) {
2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = ExperimentalExtraNatives::GetScriptName(index);
2035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExperimentalExtraNatives>(index);
2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> binding = isolate->extras_binding_object();
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, binding, extras_utils};
2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2042109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, EXTENSION_CODE);
2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileNative(Isolate* isolate, Vector<const char> name,
2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Handle<String> source, int argc,
2047109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                 Handle<Object> argv[],
2048109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                 NativesFlag natives_flag) {
2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SuppressDebug compiling_natives(isolate->debug());
20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // During genesis, the boilerplate for stack overflow won't work until the
20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // environment has been at least partially initialized. Add a stack check
20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // before entering JS code to catch overflow early.
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StackLimitCheck check(isolate);
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (check.JsHasOverflowed(1 * KB)) {
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    isolate->StackOverflow();
2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return false;
2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context(isolate->context());
2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> script_name =
2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewStringFromUtf8(name).ToHandleChecked();
20633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<SharedFunctionInfo> function_info =
20643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Compiler::GetSharedFunctionInfoForScript(
20653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
20663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          context, NULL, NULL, ScriptCompiler::kNoCompileOptions, natives_flag,
20673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          false);
2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (function_info.is_null()) return false;
2069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(context->IsNativeContext());
2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> fun =
2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info,
2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                            context);
2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->factory()->undefined_value();
2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // For non-extension scripts, run script to get the function wrapper.
2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> wrapper;
2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) {
2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return false;
2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Then run the function wrapper.
2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, Handle<JSFunction>::cast(wrapper), receiver,
2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          argc, argv).is_null();
2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::CallUtilsFunction(Isolate* isolate, const char* name) {
2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> utils =
2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject>::cast(isolate->natives_utils_object());
2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string =
2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewStringFromAsciiChecked(name);
2093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->factory()->undefined_value();
2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {utils};
2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, fun, receiver, 1, args).is_null();
2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) {
2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory = isolate->factory();
2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
21036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<SharedFunctionInfo> function_info;
2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source =
2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()
2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ->NewExternalStringFromOneByte(extension->source())
2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .ToHandleChecked();
2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(source->IsOneByteRepresentation());
2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If we can't find the function in the cache, we compile a new
2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function and insert it into the cache.
2113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = CStrVector(extension->name());
2114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SourceCodeCache* cache = isolate->bootstrapper()->extensions_cache();
2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context(isolate->context());
2116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(context->IsNativeContext());
2117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!cache->Lookup(name, &function_info)) {
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> script_name =
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->NewStringFromUtf8(name).ToHandleChecked();
21213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    function_info = Compiler::GetSharedFunctionInfoForScript(
2122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
2123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        context, extension, NULL, ScriptCompiler::kNoCompileOptions,
2124109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        EXTENSION_CODE, false);
21256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (function_info.is_null()) return false;
2126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cache->Add(name, function_info);
2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the function context. Conceptually, we should clone the
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function before overwriting the context but since we're in a
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // single-threaded environment it is not strictly necessary.
2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> fun =
213344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      factory->NewFunctionFromSharedFunctionInfo(function_info, context);
2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
21354515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  // Call function using either the runtime object or the global
2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object as the receiver. Provide no parameters.
2137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->global_object();
2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, fun, receiver, 0, NULL).is_null();
2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Handle<JSObject> ResolveBuiltinIdHolder(Handle<Context> native_context,
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               const char* holder_expr) {
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory = isolate->factory();
2146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(native_context->global_object());
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* period_pos = strchr(holder_expr, '.');
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (period_pos == NULL) {
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<JSObject>::cast(
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Object::GetPropertyOrElement(
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            global, factory->InternalizeUtf8String(holder_expr))
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            .ToHandleChecked());
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* inner = period_pos + 1;
2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!strchr(inner, '.'));
2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Vector<const char> property(holder_expr,
2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              static_cast<int>(period_pos - holder_expr));
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> property_string = factory->InternalizeUtf8String(property);
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!property_string.is_null());
2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> object = Handle<JSObject>::cast(
21613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(global, property_string).ToHandleChecked());
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (strcmp("prototype", inner) == 0) {
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> function = Handle<JSFunction>::cast(object);
2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<JSObject>(JSObject::cast(function->prototype()));
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> inner_string = factory->InternalizeUtf8String(inner);
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!inner_string.is_null());
2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> value =
21693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(object, inner_string).ToHandleChecked();
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Handle<JSObject>::cast(value);
2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2173109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Genesis::ConfigureUtilsObject(GlobalContextType context_type) {
2174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (context_type) {
2175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // We still need the utils object to find debug functions.
2176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DEBUG_CONTEXT:
2177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
2178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Expose the natives in global if a valid name for it is specified.
2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FULL_CONTEXT: {
2180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We still need the utils object after deserialization.
2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (isolate()->serializer_enabled()) return;
2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (FLAG_expose_natives_as == NULL) break;
2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (strlen(FLAG_expose_natives_as) == 0) break;
2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      HandleScope scope(isolate());
2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<String> natives_key =
2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          factory()->InternalizeUtf8String(FLAG_expose_natives_as);
2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      uint32_t dummy_index;
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (natives_key->AsArrayIndex(&dummy_index)) break;
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Object> utils = isolate()->natives_utils_object();
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> global = isolate()->global_object();
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::AddProperty(global, natives_key, utils, DONT_ENUM);
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case THIN_CONTEXT:
2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The utils object can be removed for cases that reach this point.
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_natives_utils_object(heap()->undefined_value());
2200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Bootstrapper::ExportFromRuntime(Isolate* isolate,
2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Handle<JSObject> container) {
2205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> native_context = isolate->native_context();
2208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPORT_PRIVATE_SYMBOL(NAME)                                       \
2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(container, NAME##_name, factory->NAME(), NONE);
2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PRIVATE_SYMBOL_LIST(EXPORT_PRIVATE_SYMBOL)
2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef EXPORT_PRIVATE_SYMBOL
2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPORT_PUBLIC_SYMBOL(NAME, DESCRIPTION)                           \
2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
2216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(container, NAME##_name, factory->NAME(), NONE);
2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PUBLIC_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WELL_KNOWN_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef EXPORT_PUBLIC_SYMBOL
2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> to_string = InstallFunction(
2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "object_to_string", JS_OBJECT_TYPE, JSObject::kHeaderSize,
2224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MaybeHandle<JSObject>(), Builtins::kObjectProtoToString);
2225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_string->shared()->DontAdaptArguments();
2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_string->shared()->set_length(0);
2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_object_to_string(*to_string);
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> iterator_prototype;
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PrototypeIterator iter(native_context->generator_object_prototype_map());
2234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iter.Advance();  // Advance to the prototype of generator_object_prototype.
2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator_prototype = Handle<JSObject>(iter.GetCurrent<JSObject>());
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(container,
2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          factory->InternalizeUtf8String("IteratorPrototype"),
2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          iterator_prototype, NONE);
2240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PrototypeIterator iter(native_context->sloppy_generator_function_map());
2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> generator_function_prototype(iter.GetCurrent<JSObject>());
2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(
2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, factory->InternalizeUtf8String("GeneratorFunctionPrototype"),
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        generator_function_prototype, NONE);
2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const bool kUseStrictFunctionMap = true;
2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> generator_function_function = InstallFunction(
2252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "GeneratorFunction", JS_FUNCTION_TYPE, JSFunction::kSize,
2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        generator_function_prototype, Builtins::kGeneratorFunctionConstructor,
2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        kUseStrictFunctionMap);
2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->set_prototype_or_initial_map(
2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context->sloppy_generator_function_map());
2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->shared()->DontAdaptArguments();
2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->shared()->set_construct_stub(
2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->GeneratorFunctionConstructor());
2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->shared()->set_length(1);
2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(
2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate, generator_function_function,
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Context::GENERATOR_FUNCTION_FUNCTION_INDEX);
2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2265bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SetObjectPrototype(generator_function_function,
2266bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                       isolate->function_function());
2267bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    JSObject::AddProperty(
2268bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        generator_function_prototype, factory->constructor_string(),
2269bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        generator_function_function,
2270bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2271bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->sloppy_generator_function_map()->SetConstructor(
2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *generator_function_function);
2274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->strict_generator_function_map()->SetConstructor(
2275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *generator_function_function);
2276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S e t I t e r a t o r
2279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> set_iterator_prototype =
2280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
2281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SetObjectPrototype(set_iterator_prototype, iterator_prototype);
2282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> set_iterator_function = InstallFunction(
2283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        set_iterator_prototype, Builtins::kIllegal);
2285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_set_iterator_map(set_iterator_function->initial_map());
2286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a p I t e r a t o r
2289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> map_iterator_prototype =
2290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SetObjectPrototype(map_iterator_prototype, iterator_prototype);
2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> map_iterator_function = InstallFunction(
2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "MapIterator", JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize,
2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        map_iterator_prototype, Builtins::kIllegal);
2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_map_iterator_map(map_iterator_function->initial_map());
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- S c r i p t
2299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for Script.
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> script_fun = InstallFunction(
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "Script", JS_VALUE_TYPE, JSValue::kSize,
2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
2303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSObject> prototype =
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
2305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(script_fun, prototype).Assert();
2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_script_function(*script_fun);
2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(script_map, 15);
2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs =
2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_column =
2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptColumnOffsetInfo(isolate, attribs);
2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_column->name())), script_column,
2319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<AccessorInfo> script_id = Accessors::ScriptIdInfo(isolate, attribs);
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(Handle<Name>(Name::cast(script_id->name())),
2326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   script_id, attribs);
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_name =
2332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptNameInfo(isolate, attribs);
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_name->name())), script_name, attribs);
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_line =
2340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptLineOffsetInfo(isolate, attribs);
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_line->name())), script_line, attribs);
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source =
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceInfo(isolate, attribs);
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_source->name())), script_source,
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_type =
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptTypeInfo(isolate, attribs);
2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_type->name())), script_type, attribs);
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_compilation_type =
2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptCompilationTypeInfo(isolate, attribs);
2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_compilation_type->name())),
2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_compilation_type, attribs);
2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_line_ends =
2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptLineEndsInfo(isolate, attribs);
2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_line_ends->name())), script_line_ends,
2378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_context_data =
2383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptContextDataInfo(isolate, attribs);
2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_context_data->name())),
2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_context_data, attribs);
2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_script =
2392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromScriptInfo(isolate, attribs);
2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_script->name())),
2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_script, attribs);
2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_script_position =
2401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromScriptPositionInfo(isolate, attribs);
2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_script_position->name())),
2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_script_position, attribs);
2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_function_name =
2410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromFunctionNameInfo(isolate, attribs);
2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_function_name->name())),
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_function_name, attribs);
2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source_url =
2419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceUrlInfo(isolate, attribs);
2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_source_url->name())),
2423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          script_source_url, attribs);
2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source_mapping_url =
2428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceMappingUrlInfo(isolate, attribs);
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_source_mapping_url->name())),
2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_source_mapping_url, attribs);
2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<AccessorInfo> script_is_embedder_debug_script =
2437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptIsEmbedderDebugScriptInfo(isolate, attribs);
2438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
2439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_is_embedder_debug_script->name())),
2441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          script_is_embedder_debug_script, attribs);
2442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      script_map->AppendDescriptor(&d);
2443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2444bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2445bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    {
2446bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      PrototypeIterator iter(native_context->sloppy_async_function_map());
2447bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSObject> async_function_prototype(iter.GetCurrent<JSObject>());
2448bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2449bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      static const bool kUseStrictFunctionMap = true;
2450bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_constructor = InstallFunction(
2451bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          container, "AsyncFunction", JS_FUNCTION_TYPE, JSFunction::kSize,
2452bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_prototype, Builtins::kAsyncFunctionConstructor,
2453bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          kUseStrictFunctionMap);
2454bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->set_prototype_or_initial_map(
2455bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          native_context->sloppy_async_function_map());
2456bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->shared()->DontAdaptArguments();
2457bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->shared()->set_construct_stub(
2458bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          *isolate->builtins()->AsyncFunctionConstructor());
2459bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->shared()->set_length(1);
2460bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      InstallWithIntrinsicDefaultProto(isolate, async_function_constructor,
2461bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                       Context::ASYNC_FUNCTION_FUNCTION_INDEX);
2462bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2463bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSObject::AddProperty(
2464bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_prototype, factory->constructor_string(),
2465bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_constructor,
2466bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2467bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2468bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSFunction::SetPrototype(async_function_constructor,
2469bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                               async_function_prototype);
2470bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2471bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_next =
2472bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          SimpleInstallFunction(container, "AsyncFunctionNext",
2473bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                Builtins::kGeneratorPrototypeNext, 2, false);
2474bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_throw =
2475bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          SimpleInstallFunction(container, "AsyncFunctionThrow",
2476bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                Builtins::kGeneratorPrototypeThrow, 2, false);
2477bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_next->shared()->set_native(true);
2478bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_throw->shared()->set_native(true);
2479bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
2480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Bootstrapper::ExportExperimentalFromRuntime(Isolate* isolate,
2485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 Handle<JSObject> container) {
2486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define INITIALIZE_FLAG(FLAG)                                         \
2489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                                   \
2490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> name =                                             \
2491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewStringFromAsciiChecked(#FLAG);         \
2492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(container, name,                            \
2493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          isolate->factory()->ToBoolean(FLAG), NONE); \
2494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  INITIALIZE_FLAG(FLAG_harmony_species)
2497bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  INITIALIZE_FLAG(FLAG_intl_extra)
2498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef INITIALIZE_FLAG
2500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(id) \
2504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Genesis::InitializeGlobal_##id() {}
2505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_unicode_regexps)
2507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_do_expressions)
2508bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_for_in)
2509109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_iterator_close)
25103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_exec)
2511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_lookbehind)
2512109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_property)
2513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_function_name)
2514109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_function_sent)
2515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(promise_extra)
2516bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(intl_extra)
2517bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_explicit_tailcalls)
2518109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_tailcalls)
2519109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_instanceof)
25203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_restrictive_declarations)
25213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_exponentiation_operator)
25223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_string_padding)
2523bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef V8_I18N_SUPPORT
2524bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(icu_case_mapping)
2525bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif
2526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_async_await)
2527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstallPublicSymbol(Factory* factory, Handle<Context> native_context,
2529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         const char* name, Handle<Symbol> value) {
2530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(
2531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context->global_object()));
2532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> symbol_string = factory->InternalizeUtf8String("Symbol");
2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> symbol = Handle<JSObject>::cast(
2534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::GetProperty(global, symbol_string).ToHandleChecked());
2535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = factory->InternalizeUtf8String(name);
2536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attributes =
2537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
2538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(symbol, name_string, value, attributes);
2539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_regexp_subclass() {
2543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_regexp_subclass) return;
2544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallPublicSymbol(factory(), native_context(), "match",
2545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      factory()->match_symbol());
2546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallPublicSymbol(factory(), native_context(), "replace",
2547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      factory()->replace_symbol());
2548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallPublicSymbol(factory(), native_context(), "search",
2549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      factory()->search_symbol());
2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallPublicSymbol(factory(), native_context(), "split",
2551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      factory()->split_symbol());
2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
2556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_sharedarraybuffer) return;
2557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(native_context()->global_object());
2559bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Isolate* isolate = global->GetIsolate();
2560bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Factory* factory = isolate->factory();
2561bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> shared_array_buffer_fun =
2563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallArrayBuffer(global, "SharedArrayBuffer");
2564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_shared_array_buffer_fun(*shared_array_buffer_fun);
2565bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2566bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<String> name = factory->InternalizeUtf8String("Atomics");
2567bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> cons = factory->NewFunction(name);
2568bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSFunction::SetInstancePrototype(
2569bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      cons,
2570bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<Object>(native_context()->initial_object_prototype(), isolate));
2571bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSObject> atomics_object = factory->NewJSObject(cons, TENURED);
2572bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(atomics_object->IsJSObject());
2573bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(global, name, atomics_object, DONT_ENUM);
2574bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2575bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("load"),
2576bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kAtomicsLoad, 2, true);
2577bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("store"),
2578bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kAtomicsStore, 3, true);
2579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_simd() {
2583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_simd) return;
2584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(
2586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context()->global_object()));
2587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = global->GetIsolate();
2588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
2589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name = factory->InternalizeUtf8String("SIMD");
2591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> cons = factory->NewFunction(name);
2592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSFunction::SetInstancePrototype(
2593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      cons,
2594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Object>(native_context()->initial_object_prototype(), isolate));
2595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  cons->shared()->set_instance_class_name(*name);
2596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> simd_object = factory->NewJSObject(cons, TENURED);
2597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(simd_object->IsJSObject());
2598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(global, name, simd_object, DONT_ENUM);
2599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Install SIMD type functions. Set the instance class names since
2601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// InstallFunction only does this when we install on the JSGlobalObject.
2602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define SIMD128_INSTALL_FUNCTION(TYPE, Type, type, lane_count, lane_type) \
2603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> type##_function = InstallFunction(                   \
2604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      simd_object, #Type, JS_VALUE_TYPE, JSValue::kSize,                  \
2605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->initial_object_prototype(), Builtins::kIllegal);           \
2606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_##type##_function(*type##_function);              \
2607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type##_function->shared()->set_instance_class_name(*factory->Type##_string());
2608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SIMD128_TYPES(SIMD128_INSTALL_FUNCTION)
2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef SIMD128_INSTALL_FUNCTION
2610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2613109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Genesis::InitializeGlobal_harmony_object_values_entries() {
2614109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (!FLAG_harmony_object_values_entries) return;
2615109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2616109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Handle<JSGlobalObject> global(
2617109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      JSGlobalObject::cast(native_context()->global_object()));
2618109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Isolate* isolate = global->GetIsolate();
2619109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Factory* factory = isolate->factory();
2620109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2621109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Handle<JSFunction> object_function = isolate->object_function();
2622109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  SimpleInstallFunction(object_function, factory->entries_string(),
2623109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        Builtins::kObjectEntries, 1, false);
2624109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  SimpleInstallFunction(object_function, factory->values_string(),
2625109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        Builtins::kObjectValues, 1, false);
2626109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
2627109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2628109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Genesis::InitializeGlobal_harmony_object_own_property_descriptors() {
2629109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (!FLAG_harmony_object_own_property_descriptors) return;
2630109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2631109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Handle<JSGlobalObject> global(
2632109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      JSGlobalObject::cast(native_context()->global_object()));
2633109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Isolate* isolate = global->GetIsolate();
2634109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Factory* factory = isolate->factory();
2635109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2636109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Handle<JSFunction> object_function = isolate->object_function();
2637109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  SimpleInstallFunction(object_function,
2638109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        factory->getOwnPropertyDescriptors_string(),
2639109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        Builtins::kObjectGetOwnPropertyDescriptors, 1, false);
2640109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
2641109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
26423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Genesis::InitializeGlobal_harmony_array_prototype_values() {
26433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!FLAG_harmony_array_prototype_values) return;
26443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSFunction> array_constructor(native_context()->array_function());
26453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSObject> array_prototype(
26463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::cast(array_constructor->instance_prototype()));
26473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> values_iterator =
26483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::GetProperty(array_prototype, factory()->iterator_symbol())
26493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          .ToHandleChecked();
26503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(values_iterator->IsJSFunction());
26513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSObject::AddProperty(array_prototype, factory()->values_string(),
26523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        values_iterator, DONT_ENUM);
2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
26543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> unscopables =
26553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::GetProperty(array_prototype, factory()->unscopables_symbol())
26563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          .ToHandleChecked();
26573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(unscopables->IsJSObject());
26583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSObject::AddProperty(Handle<JSObject>::cast(unscopables),
26593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        factory()->values_string(), factory()->true_value(),
26603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        NONE);
2661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::InstallArrayBuffer(Handle<JSObject> target,
2664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               const char* name) {
2665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Setup the {prototype} with the given {name} for @@toStringTag.
2666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype =
2667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(prototype, factory()->to_string_tag_symbol(),
2669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        factory()->NewStringFromAsciiChecked(name),
2670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Allocate the constructor with the given {prototype}.
2673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> array_buffer_fun =
2674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallFunction(target, name, JS_ARRAY_BUFFER_TYPE,
2675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      JSArrayBuffer::kSizeWithInternalFields, prototype,
2676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      Builtins::kArrayBufferConstructor);
2677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_buffer_fun->shared()->set_construct_stub(
2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *isolate()->builtins()->ArrayBufferConstructor_ConstructStub());
2679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_buffer_fun->shared()->DontAdaptArguments();
2680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_buffer_fun->shared()->set_length(1);
2681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install the "constructor" property on the {prototype}.
2683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(prototype, factory()->constructor_string(),
2684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        array_buffer_fun, DONT_ENUM);
2685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SimpleInstallFunction(array_buffer_fun, factory()->isView_string(),
2687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Builtins::kArrayBufferIsView, 1, true);
2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return array_buffer_fun;
2690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_species() {
2694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_species) return;
2695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallPublicSymbol(factory(), native_context(), "species",
2696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      factory()->species_symbol());
2697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::InstallInternalArray(Handle<JSObject> target,
2701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 const char* name,
2702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 ElementsKind elements_kind) {
2703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // --- I n t e r n a l   A r r a y ---
2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // An array constructor on the builtins object that works like
2705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the public Array constructor, except that its prototype
2706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // doesn't inherit from Object.prototype.
2707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // To be used only for internal work by builtins. Instances
2708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // must not be leaked to user code.
2709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype =
2710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
2711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> array_function =
2712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallFunction(target, name, JS_ARRAY_TYPE, JSArray::kSize, prototype,
2713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      Builtins::kInternalArrayCode);
2714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InternalArrayConstructorStub internal_array_constructor_stub(isolate());
2716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code = internal_array_constructor_stub.GetCode();
2717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_function->shared()->set_construct_stub(*code);
2718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_function->shared()->DontAdaptArguments();
2719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> original_map(array_function->initial_map());
2721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> initial_map = Map::Copy(original_map, "InternalArray");
2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  initial_map->set_elements_kind(elements_kind);
2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSFunction::SetInitialMap(array_function, initial_map, prototype);
2724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Make "length" magic on instances.
2726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::EnsureDescriptorSlack(initial_map, 1);
2727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attribs = static_cast<PropertyAttributes>(
2729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DONT_ENUM | DONT_DELETE);
2730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<AccessorInfo> array_length =
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::ArrayLengthInfo(isolate(), attribs);
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // Add length.
2734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(array_length->name())),
2735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 array_length, attribs);
2736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->AppendDescriptor(&d);
2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return array_function;
2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2742109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Genesis::InstallNatives(GlobalContextType context_type) {
2743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
2744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the utils object as shared container between native scripts.
2746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function());
2747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16,
2748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                "utils container for native scripts");
2749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_natives_utils_object(*utils);
2750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the extras utils object as a shared container between native
2752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // scripts and extras. (Extras consume things added there by native scripts.)
2753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> extras_utils =
2754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function());
2755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_extras_utils_object(*extras_utils);
2756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallInternalArray(extras_utils, "InternalPackedArray", FAST_ELEMENTS);
2758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int builtin_index = Natives::GetDebuggerCount();
2760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Only run prologue.js and runtime.js at this point.
2761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(builtin_index, Natives::GetIndex("prologue"));
2762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
2763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(builtin_index, Natives::GetIndex("runtime"));
2764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
2765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // A thin context is ready at this point.
2767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (context_type == THIN_CONTEXT) return true;
2768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
27696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  {
27706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Builtin function for OpaqueReference -- a JSValue-based object,
27716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // that keeps its field isolated from JavaScript code. It may store
27726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // objects, that JavaScript code may not access.
2773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> opaque_reference_fun = factory()->NewFunction(
2774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory()->empty_string(), isolate()->builtins()->Illegal(),
2775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate()->initial_object_prototype(), JS_VALUE_TYPE, JSValue::kSize);
27766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<JSObject> prototype =
2777257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        factory()->NewJSObject(isolate()->object_function(), TENURED);
2778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(opaque_reference_fun, prototype).Assert();
2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_opaque_reference_function(*opaque_reference_fun);
27806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
27816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // InternalArrays should not use Smi-Only array optimizations. There are too
2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // many places in the C++ runtime code (e.g. RegEx) that assume that
2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // elements in InternalArrays can be set to non-Smi values without going
2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // transition easy to trap. Moreover, they rarely are smi-only.
2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HandleScope scope(isolate());
2789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> utils =
2790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<JSObject>::cast(isolate()->natives_utils_object());
2791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    Handle<JSFunction> array_function =
2792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallInternalArray(utils, "InternalArray", FAST_HOLEY_ELEMENTS);
2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_internal_array_function(*array_function);
2794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallInternalArray(utils, "InternalPackedArray", FAST_ELEMENTS);
2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Run the rest of the native scripts.
2798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (builtin_index < Natives::GetBuiltinsCount()) {
2799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
28013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!CallUtilsFunction(isolate(), "PostNatives")) return false;
2803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
28043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  auto template_instantiations_cache = UnseededNumberDictionary::New(
28053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      isolate(), ApiNatives::kInitialFunctionCacheSize);
2806109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  native_context()->set_template_instantiations_cache(
2807109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      *template_instantiations_cache);
2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store the map for the %ObjectPrototype% after the natives has been compiled
2810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // and the Object function has been set up.
2811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> object_function(native_context()->object_function());
2812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(JSObject::cast(object_function->initial_map()->prototype())
2813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             ->HasFastProperties());
2814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_object_function_prototype_map(
2815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      HeapObject::cast(object_function->initial_map()->prototype())->map());
2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store the map for the %StringPrototype% after the natives has been compiled
28183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // and the String function has been set up.
2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> string_function(native_context()->string_function());
2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(JSObject::cast(
2821756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      string_function->initial_map()->prototype())->HasFastProperties());
2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_string_function_prototype_map(
2823756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      HeapObject::cast(string_function->initial_map()->prototype())->map());
2824756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2825bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSGlobalObject> global_object =
2826bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      handle(native_context()->global_object());
2827bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2828bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Install Global.encodeURI.
2829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(global_object, "encodeURI", Builtins::kGlobalEncodeURI,
2830bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        1, false);
2831bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2832bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Install Global.encodeURIComponent.
2833bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(global_object, "encodeURIComponent",
2834bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGlobalEncodeURIComponent, 1, false);
2835bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install Global.eval.
2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2838bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> eval =
2839bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        SimpleInstallFunction(global_object, factory()->eval_string(),
2840bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                              Builtins::kGlobalEval, 1, false);
2841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_global_eval_fun(*eval);
2842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install Array.prototype.concat
2845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> array_constructor(native_context()->array_function());
2847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()));
2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> concat =
2849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize,
2850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        MaybeHandle<JSObject>(), Builtins::kArrayConcat);
2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Make sure that Array.prototype.concat appears to be compiled.
2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // The code will never be called, but inline caching for call will
2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // only work if it appears to be compiled.
2855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->DontAdaptArguments();
2856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(concat->is_compiled());
2857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the lengths for the functions to satisfy ECMA-262.
2858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->set_length(1);
2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install InternalArray.prototype.concat
2862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> array_constructor(
2864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context()->internal_array_function());
2865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()));
2866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> concat =
2867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize,
2868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        MaybeHandle<JSObject>(), Builtins::kArrayConcat);
2869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Make sure that InternalArray.prototype.concat appears to be compiled.
2871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The code will never be called, but inline caching for call will
2872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // only work if it appears to be compiled.
2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->DontAdaptArguments();
2874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(concat->is_compiled());
2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Set the lengths for the functions to satisfy ECMA-262.
2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->set_length(1);
2877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the Promise constructor.
2880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> key = factory()->Promise_string();
2882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> function = Handle<JSFunction>::cast(
2883bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        JSReceiver::GetProperty(global_object, key).ToHandleChecked());
2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSFunction::EnsureHasInitialMap(function);
2885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function->initial_map()->set_instance_type(JS_PROMISE_TYPE);
2886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function->shared()->set_construct_stub(
2887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate()->builtins()->JSBuiltinsConstructStub());
2888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate(), function,
2889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::PROMISE_FUNCTION_INDEX);
2890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
289242effa50d92d47f80404ee63808dbde9921e6202Ben Murdoch  InstallBuiltinFunctionIds();
289342effa50d92d47f80404ee63808dbde9921e6202Ben Murdoch
2894109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Create a map for accessor property descriptors (a variant of JSObject
2895109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // that predefines four properties get, set, configurable and enumerable).
2896109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  {
2897109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // AccessorPropertyDescriptor initial map.
2898109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<Map> map =
2899109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory()->NewMap(JS_OBJECT_TYPE, JSAccessorPropertyDescriptor::kSize);
2900109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the descriptor array for the property descriptor object.
2901109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::EnsureDescriptorSlack(map, 4);
2902109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2903109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // get
2904109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->get_string(),
2905109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kGetIndex, NONE,
2906109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2907109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2908109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2909109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // set
2910109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->set_string(),
2911109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kSetIndex, NONE,
2912109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2913109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2914109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2915109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // enumerable
2916109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->enumerable_string(),
2917109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kEnumerableIndex, NONE,
2918109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2919109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2920109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2921109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // configurable
2922109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->configurable_string(),
2923109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kConfigurableIndex, NONE,
2924109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2925109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2926109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2927109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2928109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::SetPrototype(map, isolate()->initial_object_prototype());
2929109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
2930109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetInObjectProperties(4);
2931109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_unused_property_fields(0);
2932109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2933109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    native_context()->set_accessor_property_descriptor_map(*map);
2934109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
2935109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2936109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Create a map for data property descriptors (a variant of JSObject
2937109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // that predefines four properties value, writable, configurable and
2938109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // enumerable).
2939109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  {
2940109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // DataPropertyDescriptor initial map.
2941109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<Map> map =
2942109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory()->NewMap(JS_OBJECT_TYPE, JSDataPropertyDescriptor::kSize);
2943109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the descriptor array for the property descriptor object.
2944109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::EnsureDescriptorSlack(map, 4);
2945109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2946109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // value
2947109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->value_string(),
2948109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kValueIndex, NONE,
2949109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2950109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2951109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2952109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // writable
2953109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->writable_string(),
2954109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kWritableIndex, NONE,
2955109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2956109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2957109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2958109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // enumerable
2959109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->enumerable_string(),
2960109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kEnumerableIndex, NONE,
2961109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2962109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2963109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2964109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // configurable
2965109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->configurable_string(),
2966109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kConfigurableIndex, NONE,
2967109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2968109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
2969109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2970109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2971109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::SetPrototype(map, isolate()->initial_object_prototype());
2972109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
2973109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetInObjectProperties(4);
2974109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_unused_property_fields(0);
2975109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    native_context()->set_data_property_descriptor_map(*map);
2977109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
2978109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
29796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Create a constructor for RegExp results (a variant of Array that
29806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // predefines the two properties index and match).
29816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  {
29826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // RegExpResult initial map.
29836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Find global.Array.prototype to inherit from.
2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> array_constructor(native_context()->array_function());
29866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<JSObject> array_prototype(
29876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        JSObject::cast(array_constructor->instance_prototype()));
29886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Add initial map.
29906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<Map> initial_map =
2991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize);
2992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetConstructor(*array_constructor);
29936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Set prototype on map.
29956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_non_instance_prototype(false);
2996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(initial_map, array_prototype);
29976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Update map with length accessor from Array and add "index" and "input".
2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(initial_map, 3);
3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSFunction* array_function = native_context()->array_function();
3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<DescriptorArray> array_descriptors(
3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          array_function->initial_map()->instance_descriptors());
3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<String> length = factory()->length_string();
3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int old = array_descriptors->SearchWithCache(
3007109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          isolate(), *length, array_function->initial_map());
3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(old != DescriptorArray::kNotFound);
3009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor desc(
3010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          length, handle(array_descriptors->GetValue(old), isolate()),
3011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          array_descriptors->GetDetails(old).attributes());
3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&desc);
3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
30146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    {
3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor index_field(factory()->index_string(),
3016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 JSRegExpResult::kIndexIndex, NONE,
3017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Representation::Tagged());
3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&index_field);
30196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
30206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
30216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    {
3022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor input_field(factory()->input_string(),
3023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 JSRegExpResult::kInputIndex, NONE,
3024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Representation::Tagged());
3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&input_field);
30266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
30276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetInObjectProperties(2);
30296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_unused_property_fields(0);
30306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_regexp_result_map(*initial_map);
30326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
30336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Add @@iterator method to the arguments object maps.
3035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = DONT_ENUM;
3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> arguments_iterator =
3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::ArgumentsIteratorInfo(isolate(), attribs);
3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Map> map(native_context()->sloppy_arguments_map());
3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Map> map(native_context()->fast_aliased_arguments_map());
3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Map> map(native_context()->slow_aliased_arguments_map());
3057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::EnsureDescriptorSlack(map, 1);
3058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
3061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Map> map(native_context()->strict_arguments_map());
3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
3070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3073257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbool Genesis::InstallExperimentalNatives() {
3074109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_iterator_close_natives[] = {nullptr};
3075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_species_natives[] = {"native harmony-species.js",
3076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                  nullptr};
3077bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* harmony_explicit_tailcalls_natives[] = {nullptr};
3078109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_tailcalls_natives[] = {nullptr};
3079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_unicode_regexps_natives[] = {
3080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "native harmony-unicode-regexps.js", nullptr};
3081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_sharedarraybuffer_natives[] = {
3082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "native harmony-sharedarraybuffer.js", "native harmony-atomics.js", NULL};
3083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_simd_natives[] = {"native harmony-simd.js",
3084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               nullptr};
3085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_do_expressions_natives[] = {nullptr};
3086bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* harmony_for_in_natives[] = {nullptr};
30873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_regexp_exec_natives[] = {
30883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      "native harmony-regexp-exec.js", nullptr};
3089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_regexp_subclass_natives[] = {nullptr};
3090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_regexp_lookbehind_natives[] = {nullptr};
3091109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_instanceof_natives[] = {nullptr};
30923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_restrictive_declarations_natives[] = {nullptr};
3093109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_regexp_property_natives[] = {nullptr};
3094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_function_name_natives[] = {nullptr};
3095109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_function_sent_natives[] = {nullptr};
3096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* promise_extra_natives[] = {"native promise-extra.js",
3097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                nullptr};
3098bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* intl_extra_natives[] = {"native intl-extra.js", nullptr};
3099109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_object_values_entries_natives[] = {nullptr};
3100109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_object_own_property_descriptors_natives[] = {
3101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      nullptr};
31023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_array_prototype_values_natives[] = {nullptr};
31033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_exponentiation_operator_natives[] = {nullptr};
31043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_string_padding_natives[] = {
31053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      "native harmony-string-padding.js", nullptr};
3106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef V8_I18N_SUPPORT
3107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* icu_case_mapping_natives[] = {"native icu-case-mapping.js",
3108bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                   nullptr};
3109bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif
3110bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* harmony_async_await_natives[] = {
3111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      "native harmony-async-await.js", nullptr};
3112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (int i = ExperimentalNatives::GetDebuggerCount();
3114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       i < ExperimentalNatives::GetBuiltinsCount(); i++) {
3115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define INSTALL_EXPERIMENTAL_NATIVES(id, desc)                                \
3116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_##id) {                                                            \
3117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (size_t j = 0; id##_natives[j] != NULL; j++) {                        \
3118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \
3119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (strncmp(script_name.start(), id##_natives[j],                       \
3120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                  script_name.length()) == 0) {                               \
3121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (!Bootstrapper::CompileExperimentalBuiltin(isolate(), i)) {        \
3122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          return false;                                                       \
3123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }                                                                     \
3124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }                                                                       \
3125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }                                                                         \
3126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
3127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES);
3128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES);
3129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES);
3130bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    INSTALL_EXPERIMENTAL_NATIVES(intl_extra, "");
3131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    INSTALL_EXPERIMENTAL_NATIVES(promise_extra, "");
3132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef INSTALL_EXPERIMENTAL_NATIVES
3133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false;
3136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallExperimentalBuiltinFunctionIds();
3138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return true;
3139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3140257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3141257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallExtraNatives() {
3143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
3144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> extras_binding =
3146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function());
3147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_extras_binding_object(*extras_binding);
3148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = ExtraNatives::GetDebuggerCount();
3150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       i < ExtraNatives::GetBuiltinsCount(); i++) {
3151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false;
3152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
3155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallExperimentalExtraNatives() {
3159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = ExperimentalExtraNatives::GetDebuggerCount();
3160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       i < ExperimentalExtraNatives::GetBuiltinsCount(); i++) {
3161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileExperimentalExtraBuiltin(isolate(), i))
3162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return false;
3163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
3166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallDebuggerNatives() {
3170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < Natives::GetDebuggerCount(); ++i) {
3171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
3172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CallUtilsFunction(isolate(), "PostDebug");
3174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic void InstallBuiltinFunctionId(Handle<JSObject> holder,
3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     const char* function_name,
3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     BuiltinFunctionId id) {
3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = holder->GetIsolate();
3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> function_object =
31823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(isolate, holder, function_name).ToHandleChecked();
3183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
31843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  function->shared()->set_builtin_function_id(id);
318525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}
318625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
318725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
3188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \
3189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  { #holder_expr, #fun_name, k##name }                  \
3190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ,
319125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
319225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
3193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallBuiltinFunctionIds() {
3194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
3195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct BuiltinFunctionIds {
3196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const char* holder_expr;
3197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const char* fun_name;
3198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BuiltinFunctionId id;
3199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
32006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const BuiltinFunctionIds builtins[] = {
3202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)};
32036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (const BuiltinFunctionIds& builtin : builtins) {
3205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> holder =
3206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ResolveBuiltinIdHolder(native_context(), builtin.holder_expr);
3207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id);
3208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
32096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
32106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
32116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallExperimentalBuiltinFunctionIds() {
3213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_harmony_sharedarraybuffer) {
3214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    struct BuiltinFunctionIds {
3215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      const char* holder_expr;
3216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      const char* fun_name;
3217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      BuiltinFunctionId id;
3218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
32196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const BuiltinFunctionIds atomic_builtins[] = {
3221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ATOMIC_FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)};
32220d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
3223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (const BuiltinFunctionIds& builtin : atomic_builtins) {
3224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> holder =
3225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ResolveBuiltinIdHolder(native_context(), builtin.holder_expr);
3226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id);
3227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
32300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
32316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef INSTALL_BUILTIN_ID
32336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
32346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
323580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Genesis::InitializeNormalizedMapCaches() {
3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate());
3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_normalized_map_cache(*cache);
323880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
323980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
324080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Bootstrapper::InstallExtensions(Handle<Context> native_context,
32423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                     v8::ExtensionConfiguration* extensions) {
3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BootstrapperActive active(this);
3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SaveContext saved_context(isolate_);
3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate_->set_context(*native_context);
3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Genesis::InstallExtensions(native_context, extensions) &&
3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Genesis::InstallSpecialObjects(native_context);
32483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
32493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
32503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallSpecialObjects(Handle<Context> native_context) {
3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Don't install extensions into the snapshot.
3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (isolate->serializer_enabled()) return true;
3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Factory* factory = isolate->factory();
3257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSGlobalObject> global(JSGlobalObject::cast(
3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      native_context->global_object()));
3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> Error = isolate->error_function();
3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name =
3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit"));
3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::AddProperty(Error, name, stack_trace_limit, NONE);
3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Expose the debug global object in global if a name for it is specified.
3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // If loading fails we just bail out without installing the
3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // debugger but without tanking the whole context.
3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Debug* debug = isolate->debug();
3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!debug->Load()) return true;
3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Context> debug_context = debug->debug_context();
3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Set the security token for the debugger context to the same as
3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // the shell native context to allow calling between these (otherwise
3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // exposing debug global object doesn't make much sense).
3277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    debug_context->set_security_token(native_context->security_token());
3278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<String> debug_string =
3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->InternalizeUtf8String(FLAG_expose_debug_as);
3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t index;
3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (debug_string->AsArrayIndex(&index)) return true;
3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> global_proxy(debug_context->global_proxy(), isolate);
3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSObject::AddProperty(global, debug_string, global_proxy, DONT_ENUM);
3284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_expose_wasm) {
3287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WasmJs::Install(isolate, global);
3288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochstatic uint32_t Hash(RegisteredExtension* extension) {
32953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return v8::internal::ComputePointerHash(extension);
32963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
32973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGenesis::ExtensionStates::ExtensionStates() : map_(HashMap::PointersMatch, 8) {}
33003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
33013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochGenesis::ExtensionTraversalState Genesis::ExtensionStates::get_state(
33023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    RegisteredExtension* extension) {
3303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  i::HashMap::Entry* entry = map_.Lookup(extension, Hash(extension));
33043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (entry == NULL) {
33053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return UNVISITED;
33063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
33073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return static_cast<ExtensionTraversalState>(
33083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<intptr_t>(entry->value));
33093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
33103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
33113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Genesis::ExtensionStates::set_state(RegisteredExtension* extension,
33123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         ExtensionTraversalState state) {
3313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  map_.LookupOrInsert(extension, Hash(extension))->value =
33143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<void*>(static_cast<intptr_t>(state));
33153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtensions(Handle<Context> native_context,
3319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                v8::ExtensionConfiguration* extensions) {
3320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
33213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ExtensionStates extension_states;  // All extensions have state UNVISITED.
3322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InstallAutoExtensions(isolate, &extension_states) &&
3323bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_free_buffer ||
3324bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/free-buffer", &extension_states)) &&
3325bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_gc ||
3326bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/gc", &extension_states)) &&
3327bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_externalize_string ||
3328bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/externalize", &extension_states)) &&
3329bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_track_gc_object_stats ||
3330bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/statistics", &extension_states)) &&
3331bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_trigger_failure ||
3332bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
3333bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!(FLAG_ignition && FLAG_trace_ignition_dispatches) ||
3334bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/ignition-statistics",
3335bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                           &extension_states)) &&
3336bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         InstallRequestedExtensions(isolate, extensions, &extension_states);
3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallAutoExtensions(Isolate* isolate,
3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ExtensionStates* extension_states) {
3342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
3343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it != NULL;
3344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it = it->next()) {
3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (it->extension()->auto_enable() &&
3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        !InstallExtension(isolate, it, extension_states)) {
3347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallRequestedExtensions(Isolate* isolate,
3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         v8::ExtensionConfiguration* extensions,
3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         ExtensionStates* extension_states) {
3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (const char** it = extensions->begin(); it != extensions->end(); ++it) {
3358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!InstallExtension(isolate, *it, extension_states)) return false;
3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
3361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Installs a named extension.  This methods is unoptimized and does
3365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// not scale well if we want to support a large number of extensions.
3366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtension(Isolate* isolate,
3367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               const char* name,
33683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states) {
3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it != NULL;
3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it = it->next()) {
3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (strcmp(name, it->extension()->name()) == 0) {
3373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return InstallExtension(isolate, it, extension_states);
3374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Utils::ApiCheck(false,
3377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         "v8::Context::New()",
3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         "Cannot find required extension");
3379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtension(Isolate* isolate,
3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               v8::RegisteredExtension* current,
33843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states) {
3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
3386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (extension_states->get_state(current) == INSTALLED) return true;
3388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The current node has already been visited so there must be a
3389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // cycle in the dependency graph; fail.
3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!Utils::ApiCheck(extension_states->get_state(current) != VISITED,
3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       "v8::Context::New()",
3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       "Circular extension dependency")) {
3393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
3394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(extension_states->get_state(current) == UNVISITED);
33963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  extension_states->set_state(current, VISITED);
3397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v8::Extension* extension = current->extension();
3398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Install the extension's dependencies
3399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < extension->dependency_count(); i++) {
3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!InstallExtension(isolate,
3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          extension->dependencies()[i],
3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          extension_states)) {
34033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We do not expect this to throw an exception. Change this if it does.
3407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool result = CompileExtension(isolate, extension);
3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(isolate->has_pending_exception() != result);
3409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!result) {
34103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We print out the name of the extension that fail to install.
34113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // When an error is thrown during bootstrapping we automatically print
34123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the line number at which this happened to the console in the isolate
34133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // error throwing functionality.
3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    base::OS::PrintError("Error installing extension '%s'.\n",
3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         current->extension()->name());
341644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->clear_pending_exception();
3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
34183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  extension_states->set_state(current, INSTALLED);
34193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  isolate->NotifyExtensionInstalled();
3420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
3421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Genesis::ConfigureGlobalObjects(
3425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template) {
3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSObject> global_proxy(
3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSObject::cast(native_context()->global_proxy()));
3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global_object(
3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSObject::cast(native_context()->global_object()));
3430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!global_proxy_template.IsEmpty()) {
3432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Configure the global proxy object.
3433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<ObjectTemplateInfo> global_proxy_data =
3434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        v8::Utils::OpenHandle(*global_proxy_template);
3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ConfigureApiObject(global_proxy, global_proxy_data)) return false;
3436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Configure the global object.
3438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<FunctionTemplateInfo> proxy_constructor(
3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FunctionTemplateInfo::cast(global_proxy_data->constructor()));
3440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!proxy_constructor->prototype_template()->IsUndefined()) {
3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<ObjectTemplateInfo> global_object_data(
3442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          ObjectTemplateInfo::cast(proxy_constructor->prototype_template()));
3443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!ConfigureApiObject(global_object, global_object_data)) return false;
3444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
3445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetObjectPrototype(global_proxy, global_object);
3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_initial_array_prototype(
3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSArray::cast(native_context()->array_function()->prototype()));
3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_array_buffer_map(
3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->array_buffer_fun()->initial_map());
3453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_js_map_map(
3454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->js_map_fun()->initial_map());
3455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_js_set_map(
3456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->js_set_fun()->initial_map());
3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
3459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Genesis::ConfigureApiObject(Handle<JSObject> object,
3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<ObjectTemplateInfo> object_template) {
3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!object_template.is_null());
3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(FunctionTemplateInfo::cast(object_template->constructor())
3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             ->IsTemplateFor(object->map()));;
3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaybeHandle<JSObject> maybe_obj =
3469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ApiNatives::InstantiateObject(object_template);
3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> obj;
3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!maybe_obj.ToHandle(&obj)) {
3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate()->has_pending_exception());
3473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    isolate()->clear_pending_exception();
3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
3475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferObject(obj, object);
3477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
3478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferNamedProperties(Handle<JSObject> from,
3482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Handle<JSObject> to) {
3483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If JSObject::AddProperty asserts due to already existing property,
3484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // it is likely due to both global objects sharing property name(s).
3485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Merging those two global objects is impossible.
3486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The global template must not create properties that already exist
3487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in the snapshotted global object.
3488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (from->HasFastProperties()) {
3489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<DescriptorArray> descs =
3490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Handle<DescriptorArray>(from->map()->instance_descriptors());
3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) {
3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PropertyDetails details = descs->GetDetails(i);
3493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      switch (details.type()) {
3494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case DATA: {
3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key = Handle<Name>(descs->GetKey(i));
3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FieldIndex index = FieldIndex::ForDescriptor(from->map(), i);
3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DCHECK(!descs->GetDetails(i).representation().IsDouble());
3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index),
3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                isolate());
3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          JSObject::AddProperty(to, key, value, details.attributes());
3502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
3503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
3504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case DATA_CONSTANT: {
3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key = Handle<Name>(descs->GetKey(i));
3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> constant(descs->GetConstant(i), isolate());
3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          JSObject::AddProperty(to, key, constant, details.attributes());
3509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
3510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
3511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case ACCESSOR:
3512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UNREACHABLE();
3513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case ACCESSOR_CONSTANT: {
3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key(descs->GetKey(i));
3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
3517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          // If the property is already there we skip it
3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (it.IsFound()) continue;
3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DCHECK(!to->HasFastProperties());
35213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          // Add to dictionary.
3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate());
3523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          PropertyDetails d(details.attributes(), ACCESSOR_CONSTANT, i + 1,
3524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            PropertyCellType::kMutable);
35253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          JSObject::SetNormalizedProperty(to, key, callbacks, d);
3526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
3527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
3528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
3529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
3530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (from->IsJSGlobalObject()) {
3531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<GlobalDictionary> properties =
3532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<GlobalDictionary>(from->global_dictionary());
3533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int capacity = properties->Capacity();
3534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < capacity; i++) {
3535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Object* raw_key(properties->KeyAt(i));
3536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (properties->IsKey(raw_key)) {
3537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(raw_key->IsName());
3538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // If the property is already there we skip it.
3539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Name> key(Name::cast(raw_key));
3540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
3541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
3542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (it.IsFound()) continue;
3543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // Set the property.
3544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(properties->ValueAt(i)->IsPropertyCell());
3545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<PropertyCell> cell(PropertyCell::cast(properties->ValueAt(i)));
3546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Object> value(cell->value(), isolate());
3547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (value->IsTheHole()) continue;
3548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        PropertyDetails details = cell->property_details();
3549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK_EQ(kData, details.kind());
3550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        JSObject::AddProperty(to, key, value, details.attributes());
3551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
3552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<NameDictionary> properties =
3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<NameDictionary>(from->property_dictionary());
3556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int capacity = properties->Capacity();
3557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < capacity; i++) {
3558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Object* raw_key(properties->KeyAt(i));
3559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (properties->IsKey(raw_key)) {
3560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(raw_key->IsName());
3561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // If the property is already there we skip it.
3562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Name> key(Name::cast(raw_key));
3563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
3564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
3565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (it.IsFound()) continue;
3566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Set the property.
3567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Object> value = Handle<Object>(properties->ValueAt(i),
3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              isolate());
3569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(!value->IsCell());
3570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(!value->IsTheHole());
3571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        PropertyDetails details = properties->DetailsAt(i);
3572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK_EQ(kData, details.kind());
3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSObject::AddProperty(to, key, value, details.attributes());
3574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
3575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
3576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferIndexedProperties(Handle<JSObject> from,
3581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<JSObject> to) {
3582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Cloning the elements array is sufficient.
3583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> from_elements =
3584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Handle<FixedArray>(FixedArray::cast(from->elements()));
3585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> to_elements = factory()->CopyFixedArray(from_elements);
3586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  to->set_elements(*to_elements);
3587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
3591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope outer(isolate());
3592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!from->IsJSArray());
3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!to->IsJSArray());
3595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferNamedProperties(from, to);
3597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferIndexedProperties(from, to);
3598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Transfer the prototype (new map is needed).
3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> proto(from->map()->prototype(), isolate());
3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetObjectPrototype(to, proto);
3602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::MakeFunctionInstancePrototypeWritable() {
360644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The maps with writable prototype are created in CreateEmptyFunction
360744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and CreateStrictModeFunctionMaps respectively. Initially the maps are
360844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // created with read-only prototype for JS builtins processing.
3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!sloppy_function_map_writable_prototype_.is_null());
3610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!strict_function_map_writable_prototype_.is_null());
361144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
361244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Replace function instance maps to make prototype writable.
3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_map(
3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *sloppy_function_map_writable_prototype_);
3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_map(
3616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *strict_function_map_writable_prototype_);
3617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass NoTrackDoubleFieldsForSerializerScope {
3621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
3622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit NoTrackDoubleFieldsForSerializerScope(Isolate* isolate)
3623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : flag_(FLAG_track_double_fields), enabled_(false) {
3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (isolate->serializer_enabled()) {
3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Disable tracking double fields because heap numbers treated as
3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // immutable by the serializer.
3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FLAG_track_double_fields = false;
3628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      enabled_ = true;
3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~NoTrackDoubleFieldsForSerializerScope() {
3633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (enabled_) {
3634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FLAG_track_double_fields = flag_;
3635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
3636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool flag_;
3640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool enabled_;
3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3643257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochGenesis::Genesis(Isolate* isolate,
3644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
3645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 v8::Local<v8::ObjectTemplate> global_proxy_template,
3646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 v8::ExtensionConfiguration* extensions,
3647109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                 GlobalContextType context_type)
3648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : isolate_(isolate), active_(isolate->bootstrapper()) {
3649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
3650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result_ = Handle<Context>::null();
3651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Before creating the roots we must save the context and restore it
3652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // on all function exits.
365344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext saved_context(isolate);
36543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
36553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // During genesis, the boilerplate for stack overflow won't work until the
36563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // environment has been at least partially initialized. Add a stack check
36573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // before entering JS code to catch overflow early.
3658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StackLimitCheck check(isolate);
3659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (check.HasOverflowed()) {
3660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    isolate->StackOverflow();
3661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
3662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The deserializer needs to hook up references to the global proxy.
3665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create an uninitialized global proxy now if we don't have one
3666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // and initialize it later in CreateNewGlobals.
3667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalProxy> global_proxy;
3668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!maybe_global_proxy.ToHandle(&global_proxy)) {
3669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    global_proxy = isolate->factory()->NewUninitializedJSGlobalProxy();
3670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
36713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We can only de-serialize a context if the isolate was initialized from
3673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a snapshot. Otherwise we have to build the context from scratch.
3674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Also create a context from scratch to expose natives, if required by flag.
3675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!isolate->initialized_from_snapshot() ||
3676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      !Snapshot::NewContextFromSnapshot(isolate, global_proxy)
3677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           .ToHandle(&native_context_)) {
3678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context_ = Handle<Context>();
3679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!native_context().is_null()) {
3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddToWeakNativeContextList(*native_context());
3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    isolate->set_context(*native_context());
368444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->counters()->contexts_created_by_snapshot()->Increment();
3685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
3686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (FLAG_trace_maps) {
3687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Handle<JSFunction> object_fun = isolate->object_function();
3688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PrintF("[TraceMap: InitialMap map= %p SFI= %d_Object ]\n",
3689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier             reinterpret_cast<void*>(object_fun->initial_map()),
3690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier             object_fun->shared()->unique_id());
3691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Map::TraceAllTransitions(object_fun->initial_map());
3692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
3693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
3694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalObject> global_object =
3695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CreateNewGlobals(global_proxy_template, global_proxy);
3696402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalProxy(global_object, global_proxy);
3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalObject(global_object);
3699402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
3700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ConfigureGlobalObjects(global_proxy_template)) return;
37013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
37023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // We get here if there was no context snapshot.
37033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    CreateRoots();
3704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
370544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    CreateStrictModeFunctionMaps(empty_function);
3706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CreateIteratorMaps(empty_function);
3707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CreateAsyncFunctionMaps(empty_function);
3708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalObject> global_object =
3709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CreateNewGlobals(global_proxy_template, global_proxy);
3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalProxy(global_object, global_proxy);
3711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InitializeGlobal(global_object, empty_function, context_type);
371280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    InitializeNormalizedMapCaches();
3713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!InstallNatives(context_type)) return;
37153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
37163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    MakeFunctionInstancePrototypeWritable();
37173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (context_type != THIN_CONTEXT) {
3719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!InstallExtraNatives()) return;
3720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!ConfigureGlobalObjects(global_proxy_template)) return;
3721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
372244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->counters()->contexts_created_from_scratch()->Increment();
3723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Re-initialize the counter because it got incremented during snapshot
3724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // creation.
3725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    isolate->native_context()->set_errors_thrown(Smi::FromInt(0));
37263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
3727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install experimental natives. Do not include them into the
3729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // snapshot as we should be able to turn them off at runtime. Re-installing
3730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // them after they have already been deserialized would also fail.
3731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (context_type == FULL_CONTEXT) {
3732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!isolate->serializer_enabled()) {
3733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InitializeExperimentalGlobal();
3734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!InstallExperimentalNatives()) return;
3735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (FLAG_experimental_extras) {
3737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (!InstallExperimentalExtraNatives()) return;
3738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
3739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The serializer cannot serialize typed arrays. Reset those typed arrays
3741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // for each new context.
3742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (context_type == DEBUG_CONTEXT) {
3743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!isolate->serializer_enabled());
3744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InitializeExperimentalGlobal();
3745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!InstallDebuggerNatives()) return;
3746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ConfigureUtilsObject(context_type);
3749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check that the script context table is empty except for the 'this' binding.
3751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We do not need script contexts for native scripts.
3752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_global_var_shortcuts) {
3753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(1, native_context()->script_context_table()->used());
3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result_ = native_context();
3757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Support for thread preemption.
3761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Reserve space for statics needing saving and restoring.
3763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Bootstrapper::ArchiveSpacePerThread() {
376444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return sizeof(NestingCounterType);
3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Archive statics that are thread-local.
3769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* Bootstrapper::ArchiveState(char* to) {
377044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  *reinterpret_cast<NestingCounterType*>(to) = nesting_;
377144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  nesting_ = 0;
377244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return to + sizeof(NestingCounterType);
3773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Restore statics that are thread-local.
3777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* Bootstrapper::RestoreState(char* from) {
377844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  nesting_ = *reinterpret_cast<NestingCounterType*>(from);
377944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return from + sizeof(NestingCounterType);
3780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Called when the top-level V8 mutex is destroyed.
3784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::FreeThreadResources() {
3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!IsActive());
3786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
3789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
3790