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"
913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/base/ieee754.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/code-stubs.h"
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/externalize-string-extension.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/free-buffer-extension.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/gc-extension.h"
15bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/extensions/ignition-statistics-extension.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/statistics-extension.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/extensions/trigger-failure-extension.h"
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/heap/heap.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate-inl.h"
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/snapshot/natives.h"
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/snapshot/snapshot.h"
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/wasm/wasm-js.h"
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBootstrapper::Bootstrapper(Isolate* isolate)
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : isolate_(isolate),
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      nesting_(0),
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      extensions_cache_(Script::TYPE_EXTENSION) {}
3144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class Source>
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<String> Bootstrapper::SourceLookup(int index) {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(0 <= index && index < Source::GetBuiltinsCount());
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = isolate_->heap();
3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (Source::GetSourceCache(heap)->get(index)->IsUndefined(isolate_)) {
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We can use external strings for the natives.
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Vector<const char> source = Source::GetScriptSource(index);
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    NativesExternalStringResource* resource =
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new NativesExternalStringResource(source.start(), source.length());
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<ExternalOneByteString> source_code =
4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        isolate_->factory()->NewNativeSourceString(resource);
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Mark this external string with a special map.
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DCHECK(source_code->is_short());
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);
11413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* isolate = array->GetIsolate();
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < array->length(); i++) {
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Object* natives_source = array->get(i);
11713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      if (!natives_source->IsUndefined(isolate)) {
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        const NativesExternalStringResource* resource =
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            reinterpret_cast<const NativesExternalStringResource*>(
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                ExternalOneByteString::cast(natives_source)->resource());
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        delete resource;
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
123e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    }
124e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  }
125e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
126e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
127e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::TearDown() {
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(Natives::GetSourceCache(isolate_->heap()));
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap()));
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap()));
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeleteNativeSources(
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ExperimentalExtraNatives::GetSourceCache(isolate_->heap()));
134e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  extensions_cache_.Initialize(isolate_, false);  // Yes, symmetrical
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Genesis BASE_EMBEDDED {
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          v8::Local<v8::ObjectTemplate> global_proxy_template,
14313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          v8::ExtensionConfiguration* extensions, size_t context_snapshot_index,
144109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          GlobalContextType context_type);
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          v8::Local<v8::ObjectTemplate> global_proxy_template);
1473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  ~Genesis() { }
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate() const { return isolate_; }
150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Factory* factory() const { return isolate_->factory(); }
151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Heap* heap() const { return isolate_->heap(); }
152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> result() { return result_; }
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSGlobalProxy> global_proxy() { return global_proxy_; }
156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context() { return native_context_; }
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Creates some basic objects. Used for creating a context from scratch.
1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  void CreateRoots();
1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Creates the empty function.  Used for creating a context from scratch.
163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<JSFunction> CreateEmptyFunction(Isolate* isolate);
16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetRestrictedFunctionPropertiesThrower();
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetStrictArgumentsPoisonFunction();
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name);
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CreateStrictModeFunctionMaps(Handle<JSFunction> empty);
170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void CreateIteratorMaps(Handle<JSFunction> empty);
171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void CreateAsyncFunctionMaps(Handle<JSFunction> empty);
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void CreateJSProxyMaps();
1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Make the "arguments" and "caller" properties throw a TypeError on access.
17513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void AddRestrictedFunctionProperties(Handle<JSFunction> empty);
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Creates the global objects using the global proxy and the template passed
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in through the API.  We call this regardless of whether we are building a
1793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // context from scratch or using a deserialized one from the partial snapshot
1803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // but in the latter case we don't use the objects it produces directly, as
1813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // we have to used the deserialized ones that are linked together with the
1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // rest of the context snapshot.
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> CreateNewGlobals(
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::ObjectTemplate> global_proxy_template,
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSGlobalProxy> global_proxy);
1863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Hooks the given global proxy into the context.  If the context was created
1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // by deserialization then this will unhook the global proxy that was
1883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // deserialized, leaving the GC to pick it up.
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void HookUpGlobalProxy(Handle<JSGlobalObject> global_object,
1903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         Handle<JSGlobalProxy> global_proxy);
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Similarly, we want to use the global that has been created by the templates
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // passed through the API.  The global from the snapshot is detached from the
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // other objects in the snapshot.
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void HookUpGlobalObject(Handle<JSGlobalObject> global_object);
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The native context has a ScriptContextTable that store declarative bindings
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // made in script scopes.  Add a "this" binding to that table pointing to the
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // global proxy.
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallGlobalThisBinding();
1993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // New context initialization.  Used for creating a context from scratch.
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InitializeGlobal(Handle<JSGlobalObject> global_object,
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Handle<JSFunction> empty_function,
202109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        GlobalContextType context_type);
20369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeExperimentalGlobal();
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Depending on the situation, expose and/or get rid of the utils object.
205109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void ConfigureUtilsObject(GlobalContextType context_type);
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_FEATURE_INITIALIZATION(id, descr) \
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void InitializeGlobal_##id();
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION)
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION)
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION)
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_FEATURE_INITIALIZATION
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> InstallArrayBuffer(Handle<JSObject> target,
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                        const char* name, Builtins::Name call,
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                        BuiltinFunctionId id);
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> InstallInternalArray(Handle<JSObject> target,
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          const char* name,
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          ElementsKind elements_kind);
221109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool InstallNatives(GlobalContextType context_type);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallTypedArray(const char* name, ElementsKind elements_kind,
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         Handle<JSFunction>* fun);
225257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool InstallExperimentalNatives();
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallExtraNatives();
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallExperimentalExtraNatives();
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InstallDebuggerNatives();
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InstallBuiltinFunctionIds();
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void InstallExperimentalBuiltinFunctionIds();
23180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  void InitializeNormalizedMapCaches();
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum ExtensionTraversalState {
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    UNVISITED, VISITED, INSTALLED
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  class ExtensionStates {
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   public:
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ExtensionStates();
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ExtensionTraversalState get_state(RegisteredExtension* extension);
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    void set_state(RegisteredExtension* extension,
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   ExtensionTraversalState state);
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
24413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    base::HashMap map_;
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    DISALLOW_COPY_AND_ASSIGN(ExtensionStates);
2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Used both for deserialized and from-scratch contexts to add the extensions
2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // provided.
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtensions(Handle<Context> native_context,
2513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                v8::ExtensionConfiguration* extensions);
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallAutoExtensions(Isolate* isolate,
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ExtensionStates* extension_states);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallRequestedExtensions(Isolate* isolate,
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         v8::ExtensionConfiguration* extensions,
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         ExtensionStates* extension_states);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtension(Isolate* isolate,
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               const char* name,
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states);
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallExtension(Isolate* isolate,
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               v8::RegisteredExtension* current,
2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states);
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool InstallSpecialObjects(Handle<Context> native_context);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool ConfigureApiObject(Handle<JSObject> object,
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          Handle<ObjectTemplateInfo> object_template);
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ConfigureGlobalObjects(
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::ObjectTemplate> global_proxy_template);
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Migrates all properties from the 'from' object to the 'to'
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object and overrides the prototype in 'to' with the one from
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 'from'.
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void MakeFunctionInstancePrototypeWritable();
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetStrictFunctionInstanceDescriptor(Handle<Map> map,
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           FunctionMode function_mode);
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool CallUtilsFunction(Isolate* isolate, const char* name);
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool CompileExtension(Isolate* isolate, v8::Extension* extension);
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Context> result_;
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context_;
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSGlobalProxy> global_proxy_;
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Function maps. Function maps are created initially with a read only
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // prototype for the processing of JS builtins. Later the function maps are
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // replaced in order to make prototype writable. These are the final, writable
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // prototype, maps.
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> sloppy_function_map_writable_prototype_;
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> strict_function_map_writable_prototype_;
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> strict_poison_function_;
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> restricted_function_properties_thrower_;
29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  BootstrapperActive active_;
3003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  friend class Bootstrapper;
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::Iterate(ObjectVisitor* v) {
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  extensions_cache_.Iterate(v);
3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  v->Synchronize(VisitorSynchronization::kExtensions);
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Bootstrapper::CreateEnvironment(
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MaybeHandle<JSGlobalProxy> maybe_global_proxy,
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template,
31213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    v8::ExtensionConfiguration* extensions, size_t context_snapshot_index,
31313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    GlobalContextType context_type) {
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate_);
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template,
31613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                  extensions, context_snapshot_index, context_type);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> env = genesis.result();
31813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (env.is_null() || !InstallExtensions(env, extensions)) {
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<Context>();
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return scope.CloseAndEscape(env);
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<JSGlobalProxy> Bootstrapper::NewRemoteContext(
325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    MaybeHandle<JSGlobalProxy> maybe_global_proxy,
326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template) {
327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  HandleScope scope(isolate_);
328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template);
329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSGlobalProxy> global_proxy = genesis.global_proxy();
330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (global_proxy.is_null()) return Handle<JSGlobalProxy>();
331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return scope.CloseAndEscape(global_proxy);
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::DetachGlobal(Handle<Context> env) {
335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->GetIsolate()->counters()->errors_thrown_per_context()->AddSample(
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->GetErrorsThrown());
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Factory* factory = env->GetIsolate()->factory();
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy()));
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_proxy->set_native_context(*factory->null_value());
341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(global_proxy, factory->null_value());
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  global_proxy->map()->SetConstructor(*factory->null_value());
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_track_detached_contexts) {
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->GetIsolate()->AddDetachedContext(env);
345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
34674b3c146906ea120f97974b0e16aec75c17ebf66Andrei Popescu}
34774b3c146906ea120f97974b0e16aec75c17ebf66Andrei Popescu
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstallFunction(Handle<JSObject> target, Handle<Name> property_name,
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     Handle<JSFunction> function, Handle<String> function_name,
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     PropertyAttributes attributes = DONT_ENUM) {
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(target, property_name, function, attributes);
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (target->IsJSGlobalObject()) {
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function->shared()->set_instance_class_name(*function_name);
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function->shared()->set_native(true);
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
360bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid InstallFunction(Handle<JSObject> target, Handle<JSFunction> function,
361bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     Handle<Name> name,
362bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     PropertyAttributes attributes = DONT_ENUM) {
363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallFunction(target, name, function, name_string, attributes);
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
367bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name,
368bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  InstanceType type, int instance_size,
369bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  MaybeHandle<JSObject> maybe_prototype,
370bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  Builtins::Name call,
371bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                  bool strict_function_map = false) {
372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> call_code(isolate->builtins()->builtin(call));
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype;
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return maybe_prototype.ToHandle(&prototype)
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             ? factory->NewFunction(name, call_code, prototype, type,
37713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                    instance_size, strict_function_map)
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             : factory->NewFunctionWithoutPrototype(name, call_code,
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                    strict_function_map);
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name,
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   InstanceType type, int instance_size,
384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   MaybeHandle<JSObject> maybe_prototype,
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   Builtins::Name call,
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   PropertyAttributes attributes,
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   bool strict_function_map = false) {
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function =
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CreateFunction(target->GetIsolate(), name_string, type, instance_size,
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     maybe_prototype, call, strict_function_map);
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallFunction(target, name, function, name_string, attributes);
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return function;
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> InstallFunction(Handle<JSObject> target, const char* name,
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   InstanceType type, int instance_size,
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   MaybeHandle<JSObject> maybe_prototype,
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   Builtins::Name call,
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   bool strict_function_map = false) {
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* const factory = target->GetIsolate()->factory();
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attributes = DONT_ENUM;
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return InstallFunction(target, factory->InternalizeUtf8String(name), type,
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         instance_size, maybe_prototype, call, attributes,
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         strict_function_map);
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
408bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleCreateFunction(Isolate* isolate, Handle<String> name,
409bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                        Builtins::Name call, int len,
410bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                        bool adapt) {
411bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> fun =
412bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize,
413bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                     MaybeHandle<JSObject>(), call);
414bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (adapt) {
415bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    fun->shared()->set_internal_formal_parameter_count(len);
416bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } else {
417bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    fun->shared()->DontAdaptArguments();
418bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
419bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  fun->shared()->set_length(len);
420bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return fun;
421bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
422bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
423bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
424bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         Handle<String> name,
425bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         Builtins::Name call, int len,
426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         bool adapt,
427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         PropertyAttributes attrs = DONT_ENUM) {
428bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> fun =
429bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      SimpleCreateFunction(base->GetIsolate(), name, call, len, adapt);
430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  InstallFunction(base, fun, name, attrs);
431bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return fun;
432bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
434bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
435bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         const char* name, Builtins::Name call,
436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         int len, bool adapt,
437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         PropertyAttributes attrs = DONT_ENUM) {
438bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Factory* const factory = base->GetIsolate()->factory();
439bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call,
440f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                               len, adapt, attrs);
441f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
442f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
443f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
444f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         const char* name, Builtins::Name call,
445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         int len, bool adapt,
446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         BuiltinFunctionId id) {
447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSFunction> fun = SimpleInstallFunction(base, name, call, len, adapt);
448f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  fun->shared()->set_builtin_function_id(id);
449f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return fun;
450bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
451bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid SimpleInstallGetterSetter(Handle<JSObject> base, Handle<String> name,
453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               Builtins::Name call_getter,
454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               Builtins::Name call_setter,
455c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               PropertyAttributes attribs) {
456c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Isolate* const isolate = base->GetIsolate();
457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<String> getter_name =
459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Name::ToFunctionName(name, isolate->factory()->get_string())
460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          .ToHandleChecked();
461c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSFunction> getter =
462c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleCreateFunction(isolate, getter_name, call_getter, 0, true);
463c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  getter->shared()->set_native(true);
464c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
465c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<String> setter_name =
466c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Name::ToFunctionName(name, isolate->factory()->set_string())
467c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          .ToHandleChecked();
468c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSFunction> setter =
469c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleCreateFunction(isolate, setter_name, call_setter, 1, true);
470c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  setter->shared()->set_native(true);
471c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
472c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  JSObject::DefineAccessor(base, name, getter, setter, attribs).Check();
473c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
474c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
47513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochHandle<JSFunction> SimpleInstallGetter(Handle<JSObject> base,
476c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       Handle<String> name,
477c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       Handle<Name> property_name,
478c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       Builtins::Name call, bool adapt) {
47913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* const isolate = base->GetIsolate();
480c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
481c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<String> getter_name =
48213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Name::ToFunctionName(name, isolate->factory()->get_string())
48313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          .ToHandleChecked();
484c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSFunction> getter =
485c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleCreateFunction(isolate, getter_name, call, 0, adapt);
486c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  getter->shared()->set_native(true);
487c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
488c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Object> setter = isolate->factory()->undefined_value();
489c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
490c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  JSObject::DefineAccessor(base, property_name, getter, setter, DONT_ENUM)
491c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      .Check();
492c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
493c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return getter;
494c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
495c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
496c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<JSFunction> SimpleInstallGetter(Handle<JSObject> base,
497c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       Handle<String> name, Builtins::Name call,
498c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       bool adapt) {
499c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return SimpleInstallGetter(base, name, name, call, adapt);
50013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
50113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
50213e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochHandle<JSFunction> SimpleInstallGetter(Handle<JSObject> base,
50313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                       Handle<String> name, Builtins::Name call,
50413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                       bool adapt, BuiltinFunctionId id) {
50513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<JSFunction> fun = SimpleInstallGetter(base, name, call, adapt);
50613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  fun->shared()->set_builtin_function_id(id);
50713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return fun;
50813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
50913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
510bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}  // namespace
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate the map for function instances. Maps are allocated first and their
51444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // prototypes patched later, once empty function is created.
51544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Functions with this map will not have a 'prototype' property, and
5176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // can not be used as constructors.
5188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Map> function_without_prototype_map =
519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory()->CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_without_prototype_map(
5218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      *function_without_prototype_map);
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate the function map. This map is temporary, used only for processing
52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // of builtins.
52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Later the map is replaced with writable prototype map, allocated below.
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> function_map =
527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory()->CreateSloppyFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE);
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_map(*function_map);
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_with_readonly_prototype_map(
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *function_map);
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The final map for functions. Writeable prototype.
53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This map is installed in MakeFunctionInstancePrototypeWritable.
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sloppy_function_map_writable_prototype_ =
535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory()->CreateSloppyFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE);
53644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Factory* factory = isolate->factory();
53744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> object_name = factory->Object_string();
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSObject> object_function_prototype;
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- O b j e c t ---
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> object_fun = factory->NewFunction(object_name);
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount;
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int instance_size = JSObject::kHeaderSize + kPointerSize * unused;
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Map> object_function_map =
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->NewMap(JS_OBJECT_TYPE, instance_size);
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    object_function_map->SetInObjectProperties(unused);
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInitialMap(object_fun, object_function_map,
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              isolate->factory()->null_value());
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object_function_map->set_unused_property_fields(unused);
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_object_function(*object_fun);
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Allocate a new prototype for the object function.
556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object_function_prototype =
557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        factory->NewJSObject(isolate->object_function(), TENURED);
558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Handle<Map> map = Map::Copy(handle(object_function_prototype->map()),
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                "EmptyObjectPrototype");
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map->set_is_prototype_map(true);
561f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Ban re-setting Object.prototype.__proto__ to prevent Proxy security bug
562f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->set_immutable_proto(true);
563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object_function_prototype->set_map(*map);
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    native_context()->set_initial_object_prototype(*object_function_prototype);
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // For bootstrapping set the array prototype to be the same as the object
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // prototype, otherwise the missing initial_array_prototype will cause
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // assertions during startup.
569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    native_context()->set_initial_array_prototype(*object_function_prototype);
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(object_fun, object_function_prototype)
571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        .Assert();
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Allocate the empty function as the prototype for function - ES6 19.2.3
575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code(isolate->builtins()->EmptyFunction());
576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> empty_function =
577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory->NewFunctionWithoutPrototype(factory->empty_string(), code);
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the function map first and then patch the prototype later
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> empty_function_map =
581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory->CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!empty_function_map->is_dictionary_map());
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(empty_function_map, object_function_prototype);
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  empty_function_map->set_is_prototype_map(true);
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  empty_function->set_map(*empty_function_map);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // --- E m p t y ---
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> source = factory->NewStringFromStaticChars("() {}");
59044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Script> script = factory->NewScript(source);
591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_type(Script::TYPE_NATIVE);
5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->set_start_position(0);
5933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->set_end_position(source->length());
5943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  empty_function->shared()->DontAdaptArguments();
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SharedFunctionInfo::SetScript(handle(empty_function->shared()), script);
59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Set prototypes for the function maps.
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_function_map(native_context()->sloppy_function_map(),
599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                  isolate);
600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_function_without_prototype_map(
601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->sloppy_function_without_prototype_map(), isolate);
602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_map, empty_function);
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_without_prototype_map, empty_function);
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_function_map_writable_prototype_, empty_function);
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return empty_function;
6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Creates the %ThrowTypeError% function.
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic(
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Builtins::Name builtin_name) {
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name =
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("ThrowTypeError"));
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code(isolate()->builtins()->builtin(builtin_name));
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function =
61713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      factory()->NewFunctionWithoutPrototype(name, code, true);
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->shared()->DontAdaptArguments();
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // %ThrowTypeError% must not have a name property.
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (JSReceiver::DeleteProperty(function, factory()->name_string())
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .IsNothing()) {
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(false);
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // length needs to be non configurable.
627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> value(Smi::FromInt(function->shared()->length()), isolate());
628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::SetOwnPropertyIgnoreAttributes(
629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      function, factory()->length_string(), value,
630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY))
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      .Assert();
632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (JSObject::PreventExtensions(function, Object::THROW_ON_ERROR)
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .IsNothing()) {
635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(false);
636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return function;
63944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
64044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
64144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ECMAScript 5th Edition, 13.2.3
643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetRestrictedFunctionPropertiesThrower() {
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (restricted_function_properties_thrower_.is_null()) {
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    restricted_function_properties_thrower_ = GetThrowTypeErrorIntrinsic(
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kRestrictedFunctionPropertiesThrower);
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return restricted_function_properties_thrower_;
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::GetStrictArgumentsPoisonFunction() {
653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (strict_poison_function_.is_null()) {
654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    strict_poison_function_ = GetThrowTypeErrorIntrinsic(
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kRestrictedStrictArgumentsPropertiesThrower);
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return strict_poison_function_;
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
66144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate map for the prototype-less strict mode instances.
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> strict_function_without_prototype_map =
664f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory()->CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_without_prototype_map(
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *strict_function_without_prototype_map);
66744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
66844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate map for the strict mode functions. This map is temporary, used
66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // only for processing of builtins.
67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Later the map is replaced with writable prototype map, allocated below.
671f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> strict_function_map = factory()->CreateStrictFunctionMap(
672f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FUNCTION_WITH_READONLY_PROTOTYPE, empty);
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_map(*strict_function_map);
67444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
67544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The final map for the strict mode functions. Writeable prototype.
67644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This map is installed in MakeFunctionInstancePrototypeWritable.
677f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  strict_function_map_writable_prototype_ = factory()->CreateStrictFunctionMap(
678f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty);
67913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
68013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Now that the strict mode function map is available, set up the
68113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // restricted "arguments" and "caller" getters.
68213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  AddRestrictedFunctionProperties(empty);
683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
685bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Genesis::CreateIteratorMaps(Handle<JSFunction> empty) {
686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create iterator-related meta-objects.
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> iterator_prototype =
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
689f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
690f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<JSFunction> iterator_prototype_iterator = SimpleCreateFunction(
691f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      isolate(), factory()->NewStringFromAsciiChecked("[Symbol.iterator]"),
692f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Builtins::kIteratorPrototypeIterator, 0, true);
693f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  iterator_prototype_iterator->shared()->set_native(true);
694f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
695f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  JSObject::AddProperty(iterator_prototype, factory()->iterator_symbol(),
696f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        iterator_prototype_iterator, DONT_ENUM);
697f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  native_context()->set_initial_iterator_prototype(*iterator_prototype);
698f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> generator_object_prototype =
700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
701bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_initial_generator_prototype(
702bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      *generator_object_prototype);
703f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(generator_object_prototype, iterator_prototype);
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> generator_function_prototype =
705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(generator_function_prototype, empty);
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
708bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(
709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      generator_function_prototype, factory()->to_string_tag_symbol(),
710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      factory()->NewStringFromAsciiChecked("GeneratorFunction"),
711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(generator_function_prototype,
713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->prototype_string(),
714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        generator_object_prototype,
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
717bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(generator_object_prototype,
718bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->constructor_string(),
719bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        generator_function_prototype,
720bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
721bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(generator_object_prototype,
722bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->to_string_tag_symbol(),
723bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->NewStringFromAsciiChecked("Generator"),
724bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
725bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "next",
726bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeNext, 1, true);
727bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "return",
728bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeReturn, 1, true);
729bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(generator_object_prototype, "throw",
730bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kGeneratorPrototypeThrow, 1, true);
731bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
732f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Internal version of generator_prototype_next, flagged as non-native.
733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<JSFunction> generator_next_internal =
734f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      SimpleCreateFunction(isolate(), factory()->next_string(),
735f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                           Builtins::kGeneratorPrototypeNext, 1, true);
736f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  native_context()->set_generator_next_internal(*generator_next_internal);
737f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create maps for generator functions and their prototypes.  Store those
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // maps in the native context. The "prototype" property descriptor is
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // writable, non-enumerable, and non-configurable (as per ES6 draft
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // 04-14-15, section 25.2.4.3).
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Generator functions do not have "caller" or "arguments" accessors.
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> sloppy_generator_function_map =
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::Copy(strict_function_map, "SloppyGeneratorFunction");
746109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  sloppy_generator_function_map->set_is_constructor(false);
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(sloppy_generator_function_map,
748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    generator_function_prototype);
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_sloppy_generator_function_map(
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *sloppy_generator_function_map);
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> strict_generator_function_map =
753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::Copy(strict_function_map, "StrictGeneratorFunction");
754109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  strict_generator_function_map->set_is_constructor(false);
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(strict_generator_function_map,
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    generator_function_prototype);
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_strict_generator_function_map(
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *strict_generator_function_map);
759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> object_function(native_context()->object_function());
761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::SetPrototype(generator_object_prototype_map, generator_object_prototype);
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_generator_object_prototype_map(
764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *generator_object_prototype_map);
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
767bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Genesis::CreateAsyncFunctionMaps(Handle<JSFunction> empty) {
768bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // %AsyncFunctionPrototype% intrinsic
769bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSObject> async_function_prototype =
770bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
771f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(async_function_prototype, empty);
772bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
773bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(async_function_prototype,
774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->to_string_tag_symbol(),
775bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        factory()->NewStringFromAsciiChecked("AsyncFunction"),
776bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
777bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
778bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> strict_function_map(
779bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      native_context()->strict_function_without_prototype_map());
780bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> sloppy_async_function_map =
781bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Map::Copy(strict_function_map, "SloppyAsyncFunction");
782bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  sloppy_async_function_map->set_is_constructor(false);
783bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Map::SetPrototype(sloppy_async_function_map, async_function_prototype);
784bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_sloppy_async_function_map(*sloppy_async_function_map);
785bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
786bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> strict_async_function_map =
787bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Map::Copy(strict_function_map, "StrictAsyncFunction");
788bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  strict_async_function_map->set_is_constructor(false);
789bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Map::SetPrototype(strict_async_function_map, async_function_prototype);
790bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  native_context()->set_strict_async_function_map(*strict_async_function_map);
791bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
792bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
7933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Genesis::CreateJSProxyMaps() {
7943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Allocate the different maps for all Proxy types.
7953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Next to the default proxy, we need maps indicating callable and
7963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // constructable proxies.
7973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_function_map =
7983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy");
7993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_function_map->set_is_constructor(true);
8003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_function_map(*proxy_function_map);
8013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_map =
8033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS);
8043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_map->set_dictionary_map(true);
8053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_map(*proxy_map);
8063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy");
8083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_callable_map->set_is_callable();
8093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_callable_map(*proxy_callable_map);
8103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_callable_map->SetConstructor(native_context()->function_function());
8113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> proxy_constructor_map =
8133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Map::Copy(proxy_callable_map, "constructor Proxy");
8143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  proxy_constructor_map->set_is_constructor(true);
8153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  native_context()->set_proxy_constructor_map(*proxy_constructor_map);
8163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void ReplaceAccessors(Handle<Map> map,
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             Handle<String> name,
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             PropertyAttributes attributes,
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             Handle<AccessorPair> accessor_pair) {
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DescriptorArray* descriptors = map->instance_descriptors();
823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int idx = descriptors->SearchWithCache(map->GetIsolate(), *name, *map);
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  AccessorConstantDescriptor descriptor(name, accessor_pair, attributes);
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  descriptors->Replace(idx, &descriptor);
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Genesis::AddRestrictedFunctionProperties(Handle<JSFunction> empty) {
829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes rw_attribs = static_cast<PropertyAttributes>(DONT_ENUM);
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> thrower = GetRestrictedFunctionPropertiesThrower();
831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<AccessorPair> accessors = factory()->NewAccessorPair();
832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  accessors->set_getter(*thrower);
833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  accessors->set_setter(*thrower);
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
83513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<Map> map(empty->map());
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReplaceAccessors(map, factory()->arguments_string(), rw_attribs, accessors);
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReplaceAccessors(map, factory()->caller_string(), rw_attribs, accessors);
83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void AddToWeakNativeContextList(Context* context) {
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(context->IsNativeContext());
84313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = context->GetIsolate();
84413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Heap* heap = isolate->heap();
845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  { // NOLINT
84713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DCHECK(context->next_context_link()->IsUndefined(isolate));
848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Check that context is not in the list yet.
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (Object* current = heap->native_contexts_list();
85013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         !current->IsUndefined(isolate);
851bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         current = Context::cast(current)->next_context_link()) {
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(current != context);
853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list(),
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               UPDATE_WEAK_WRITE_BARRIER);
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  heap->set_native_contexts_list(context);
859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvoid Genesis::CreateRoots() {
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the native context FixedArray first and then patch the
8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // closure and extension object later (we need the empty function
8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // and the global object, but in order to create those, we need the
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // native context).
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context_ = factory()->NewNativeContext();
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddToWeakNativeContextList(*native_context());
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate()->set_context(*native_context());
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Allocate the message listeners object.
8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {
873f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<TemplateList> list = TemplateList::New(isolate(), 1);
874f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    native_context()->set_message_listeners(*list);
8753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallGlobalThisBinding() {
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScriptContextTable> script_contexts(
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->script_context_table());
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScopeInfo> scope_info = ScopeInfo::CreateGlobalThisBinding(isolate());
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> closure(native_context()->closure());
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context = factory()->NewScriptContext(closure, scope_info);
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Go ahead and hook it up while we're at it.
887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int slot = scope_info->ReceiverContextSlotIndex();
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS);
889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set(slot, native_context()->global_proxy());
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ScriptContextTable> new_script_contexts =
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ScriptContextTable::Extend(script_contexts, context);
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_script_context_table(*new_script_contexts);
894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSGlobalObject> Genesis::CreateNewGlobals(
898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template,
899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalProxy> global_proxy) {
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The argument global_proxy_template aka data is an ObjectTemplateInfo.
9013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // It has a constructor pointer that points at global_constructor which is a
9023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // FunctionTemplateInfo.
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The global_proxy_constructor is used to (re)initialize the
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // global_proxy. The global_proxy_constructor also has a prototype_template
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer that points at js_global_object_template which is an
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // ObjectTemplateInfo.
9073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // That in turn has a constructor pointer that points at
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_constructor which is a FunctionTemplateInfo.
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_constructor is used to make js_global_object_function
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // js_global_object_function is used to make the new global_object.
9113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  //
9123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // --- G l o b a l ---
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Step 1: Create a fresh JSGlobalObject.
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> js_global_object_function;
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ObjectTemplateInfo> js_global_object_template;
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!global_proxy_template.IsEmpty()) {
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Get prototype template of the global_proxy_template.
9183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<ObjectTemplateInfo> data =
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::Utils::OpenHandle(*global_proxy_template);
9203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<FunctionTemplateInfo> global_constructor =
9213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        Handle<FunctionTemplateInfo>(
9223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            FunctionTemplateInfo::cast(data->constructor()));
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> proto_template(global_constructor->prototype_template(),
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  isolate());
92513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!proto_template->IsUndefined(isolate())) {
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      js_global_object_template =
9273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          Handle<ObjectTemplateInfo>::cast(proto_template);
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
9293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (js_global_object_template.is_null()) {
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = Handle<String>(heap()->empty_string());
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate()->builtins()->Illegal();
9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<JSObject> prototype =
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory()->NewFunctionPrototype(isolate()->object_function());
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    js_global_object_function = factory()->NewFunction(
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize);
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LookupIterator it(prototype, factory()->constructor_string(),
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      LookupIterator::OWN_SKIP_INTERCEPTOR);
9413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<Object> value = Object::GetProperty(&it).ToHandleChecked();
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(it.IsFound());
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_EQ(*isolate()->object_function(), *value);
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<FunctionTemplateInfo> js_global_object_constructor(
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FunctionTemplateInfo::cast(js_global_object_template->constructor()));
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    js_global_object_function = ApiNatives::CreateApiFunction(
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate(), js_global_object_constructor, factory()->the_hole_value(),
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ApiNatives::GlobalObjectType);
9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  js_global_object_function->initial_map()->set_is_prototype_map(true);
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  js_global_object_function->initial_map()->set_dictionary_map(true);
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global_object =
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSGlobalObject(js_global_object_function);
9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Step 2: (re)initialize the global proxy object.
9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Handle<JSFunction> global_proxy_function;
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (global_proxy_template.IsEmpty()) {
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = Handle<String>(heap()->empty_string());
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate()->builtins()->Illegal();
963c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    global_proxy_function =
964c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        factory()->NewFunction(name, code, JS_GLOBAL_PROXY_TYPE,
965c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               JSGlobalProxy::SizeWithInternalFields(0));
9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<ObjectTemplateInfo> data =
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::Utils::OpenHandle(*global_proxy_template);
9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    Handle<FunctionTemplateInfo> global_constructor(
9703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            FunctionTemplateInfo::cast(data->constructor()));
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    global_proxy_function = ApiNatives::CreateApiFunction(
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate(), global_constructor, factory()->the_hole_value(),
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ApiNatives::GlobalProxyType);
9743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> global_name = factory()->global_string();
9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  global_proxy_function->shared()->set_instance_class_name(*global_name);
9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  global_proxy_function->initial_map()->set_is_access_check_needed(true);
978109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  global_proxy_function->initial_map()->set_has_hidden_prototype(true);
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects
9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return the global proxy.
9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return global_object;
9853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
9863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::HookUpGlobalProxy(Handle<JSGlobalObject> global_object,
9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                Handle<JSGlobalProxy> global_proxy) {
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set the native context for the global object.
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_object->set_native_context(*native_context());
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_object->set_global_proxy(*global_proxy);
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_proxy->set_native_context(*native_context());
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If we deserialized the context, the global proxy is already
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // correctly set up. Otherwise it's undefined.
99613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(native_context()
99713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             ->get(Context::GLOBAL_PROXY_INDEX)
99813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             ->IsUndefined(isolate()) ||
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         native_context()->global_proxy() == *global_proxy);
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_global_proxy(*global_proxy);
10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) {
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global_object_from_snapshot(
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context()->extension()));
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_extension(*global_object);
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_security_token(*global_object);
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TransferNamedProperties(global_object_from_snapshot, global_object);
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TransferIndexedProperties(global_object_from_snapshot, global_object);
1012402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1013402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic void InstallWithIntrinsicDefaultProto(Isolate* isolate,
1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             Handle<JSFunction> function,
1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             int context_index) {
1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Smi> index(Smi::FromInt(context_index), isolate);
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(
1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      function, isolate->factory()->native_context_index_symbol(), index, NONE);
1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  isolate->native_context()->set(context_index, *function);
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1023f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic void InstallError(Isolate* isolate, Handle<JSObject> global,
1024f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                         Handle<String> name, int context_index) {
1025f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Factory* factory = isolate->factory();
1026f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1027f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSFunction> error_fun =
1028f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      InstallFunction(global, name, JS_ERROR_TYPE, JSObject::kHeaderSize,
1029f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      isolate->initial_object_prototype(),
1030f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      Builtins::kErrorConstructor, DONT_ENUM);
1031f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  error_fun->shared()->set_instance_class_name(*factory->Error_string());
1032f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  error_fun->shared()->DontAdaptArguments();
1033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  error_fun->shared()->set_construct_stub(
1034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      *isolate->builtins()->ErrorConstructor());
1035f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  error_fun->shared()->set_length(1);
1036f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1037f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (context_index == Context::ERROR_FUNCTION_INDEX) {
1038f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(error_fun, "captureStackTrace",
1039f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kErrorCaptureStackTrace, 2, false);
1040f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1041f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1042f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  InstallWithIntrinsicDefaultProto(isolate, error_fun, context_index);
1043f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1044f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {
1045f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSObject> prototype =
1046f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1047f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1048f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(prototype, factory->name_string(), name, DONT_ENUM);
1049f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(prototype, factory->message_string(),
1050f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          factory->empty_string(), DONT_ENUM);
1051f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), error_fun,
1052f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          DONT_ENUM);
1053f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1054f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (context_index == Context::ERROR_FUNCTION_INDEX) {
1055f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSFunction> to_string_fun =
1056f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          SimpleInstallFunction(prototype, factory->toString_string(),
1057f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                Builtins::kErrorPrototypeToString, 0, true);
1058f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      isolate->native_context()->set_error_to_string(*to_string_fun);
1059f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    } else {
1060f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      DCHECK(isolate->native_context()->error_to_string()->IsJSFunction());
1061f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1062f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      InstallFunction(prototype, isolate->error_to_string(),
1063f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      factory->toString_string(), DONT_ENUM);
1064f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1065f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSFunction> global_error = isolate->error_function();
1066f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      CHECK(JSReceiver::SetPrototype(error_fun, global_error, false,
1067f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     Object::THROW_ON_ERROR)
1068f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                .FromMaybe(false));
1069f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      CHECK(JSReceiver::SetPrototype(prototype,
1070f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     handle(global_error->prototype(), isolate),
1071f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     false, Object::THROW_ON_ERROR)
1072f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                .FromMaybe(false));
1073f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
1074f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1075f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Accessors::FunctionSetPrototype(error_fun, prototype).Assert();
1076f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1077f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1078f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> initial_map(error_fun->initial_map());
1079f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Map::EnsureDescriptorSlack(initial_map, 1);
1080f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1081f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes attribs = DONT_ENUM;
1082f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<AccessorInfo> error_stack =
1083f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Accessors::ErrorStackInfo(isolate, attribs);
1084f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {
1085f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(error_stack->name())),
1086f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                 error_stack, attribs);
1087f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    initial_map->AppendDescriptor(&d);
1088f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1089f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1090f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1091f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstatic void InstallMakeError(Isolate* isolate, Handle<Code> code,
1092f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                             int context_index) {
1093f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSFunction> function =
1094f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      isolate->factory()->NewFunction(isolate->factory()->empty_string(), code,
1095f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                      JS_OBJECT_TYPE, JSObject::kHeaderSize);
1096f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  function->shared()->DontAdaptArguments();
1097f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  isolate->native_context()->set(context_index, *function);
1098f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1100402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// This is only called if we are not using snapshots.  The equivalent
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// work in the snapshot case is done in HookUpGlobalObject.
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               Handle<JSFunction> empty_function,
1104109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                               GlobalContextType context_type) {
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // --- N a t i v e   C o n t e x t ---
11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Use the empty function as closure (no scope info).
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_closure(*empty_function);
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_previous(NULL);
11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Set extension and global object.
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_extension(*global_object);
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Security setup: Set the security token of the native context to the global
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // object. This makes the security check between two different contexts fail
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // by default even in case of global object reinitialization.
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_security_token(*global_object);
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = global_object->GetIsolate();
111744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Factory* factory = isolate->factory();
111844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ScriptContextTable> script_context_table =
1120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      factory->NewScriptContextTable();
1121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  native_context()->set_script_context_table(*script_context_table);
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallGlobalThisBinding();
1123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- O b j e c t ---
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> object_name = factory->Object_string();
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_function = isolate->object_function();
1127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(global_object, object_name, object_function,
1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          DONT_ENUM);
1129bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(object_function, factory->assign_string(),
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kObjectAssign, 2, false);
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(object_function, factory->create_string(),
1133c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kObjectCreate, 2, true);
1134109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertyDescriptor",
1135109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertyDescriptor, 2, false);
1136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(object_function,
1137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          factory->getOwnPropertyDescriptors_string(),
1138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kObjectGetOwnPropertyDescriptors, 1, false);
1139109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertyNames",
1140109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertyNames, 1, false);
1141109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(object_function, "getOwnPropertySymbols",
1142109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          Builtins::kObjectGetOwnPropertySymbols, 1, false);
1143bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "is",
1144bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectIs, 2, true);
1145bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "preventExtensions",
1146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectPreventExtensions, 1, false);
1147bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(object_function, "seal",
1148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kObjectSeal, 1, false);
1149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_define_properties = SimpleInstallFunction(
1151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "defineProperties",
1152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kObjectDefineProperties, 2, true);
1153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_define_properties(*object_define_properties);
1154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_define_property = SimpleInstallFunction(
1156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, factory->defineProperty_string(),
1157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kObjectDefineProperty, 3, true);
1158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_define_property(*object_define_property);
1159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_freeze = SimpleInstallFunction(
1161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "freeze", Builtins::kObjectFreeze, 1, false);
1162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_freeze(*object_freeze);
1163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_get_prototype_of = SimpleInstallFunction(
1165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "getPrototypeOf", Builtins::kObjectGetPrototypeOf,
1166bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        1, false);
1167bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    native_context()->set_object_get_prototype_of(*object_get_prototype_of);
1168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(object_function, "setPrototypeOf",
1169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kObjectSetPrototypeOf, 2, false);
1170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> object_is_extensible = SimpleInstallFunction(
1172bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object_function, "isExtensible", Builtins::kObjectIsExtensible,
1173bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        1, false);
1174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_extensible(*object_is_extensible);
1175bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_is_frozen = SimpleInstallFunction(
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "isFrozen", Builtins::kObjectIsFrozen, 1, false);
1178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_frozen(*object_is_frozen);
1179bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_is_sealed = SimpleInstallFunction(
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "isSealed", Builtins::kObjectIsSealed, 1, false);
1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_is_sealed(*object_is_sealed);
1183bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> object_keys = SimpleInstallFunction(
1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_function, "keys", Builtins::kObjectKeys, 1, false);
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_object_keys(*object_keys);
1187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(object_function, factory->entries_string(),
1188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kObjectEntries, 1, false);
1189c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(object_function, factory->values_string(),
1190c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kObjectValues, 1, false);
11913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1192bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1193bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__defineGetter__", Builtins::kObjectDefineGetter, 2,
1194bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1195bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1196bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__defineSetter__", Builtins::kObjectDefineSetter, 2,
1197bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
11983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(), "hasOwnProperty",
11993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kObjectHasOwnProperty, 1, true);
1200bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1201bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__lookupGetter__", Builtins::kObjectLookupGetter, 1,
1202bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1203bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(isolate->initial_object_prototype(),
1204bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          "__lookupSetter__", Builtins::kObjectLookupSetter, 1,
1205bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          true);
1206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(
1207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        isolate->initial_object_prototype(), "propertyIsEnumerable",
1208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Builtins::kObjectPrototypePropertyIsEnumerable, 1, false);
1209c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1210c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallGetterSetter(isolate->initial_object_prototype(),
1211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              factory->proto_string(),
1212c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              Builtins::kObjectPrototypeGetProto,
1213c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              Builtins::kObjectPrototypeSetProto, DONT_ENUM);
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global(native_context()->global_object());
1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- F u n c t i o n ---
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> prototype = empty_function;
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> function_fun =
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        prototype, Builtins::kFunctionConstructor);
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->set_prototype_or_initial_map(
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *sloppy_function_map_writable_prototype_);
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->shared()->DontAdaptArguments();
1226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    function_fun->shared()->SetConstructStub(
1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->FunctionConstructor());
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_fun->shared()->set_length(1);
1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, function_fun,
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::FUNCTION_FUNCTION_INDEX);
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Setup the methods on the %FunctionPrototype%.
1233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->apply_string(),
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeApply, 2, false);
123513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (FLAG_minimal) {
1237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      SimpleInstallFunction(prototype, factory->bind_string(),
1238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                            Builtins::kFunctionPrototypeBind, 1, false);
1239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    } else {
1240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FastFunctionBindStub bind_stub(isolate);
1241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSFunction> bind_function = factory->NewFunctionWithoutPrototype(
1242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          factory->bind_string(), bind_stub.GetCode(), false);
1243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      bind_function->shared()->DontAdaptArguments();
1244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      bind_function->shared()->set_length(1);
1245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      InstallFunction(prototype, bind_function, factory->bind_string(),
1246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      DONT_ENUM);
1247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
124813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->call_string(),
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeCall, 1, false);
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, factory->toString_string(),
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kFunctionPrototypeToString, 0, false);
1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1254109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the @@hasInstance function.
1255109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> has_instance = InstallFunction(
1256109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        prototype, factory->has_instance_symbol(), JS_OBJECT_TYPE,
1257109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1258bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Builtins::kFunctionPrototypeHasInstance,
1259109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
1260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    has_instance->shared()->set_builtin_function_id(kFunctionHasInstance);
1261f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    native_context()->set_function_has_instance(*has_instance);
1262109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1263109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Set the expected parameters for @@hasInstance to 1; required by builtin.
1264109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    has_instance->shared()->set_internal_formal_parameter_count(1);
1265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1266109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Set the length for the function to satisfy ECMA-262.
1267109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    has_instance->shared()->set_length(1);
1268109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the "constructor" property on the %FunctionPrototype%.
1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(),
1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          function_fun, DONT_ENUM);
1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sloppy_function_map_writable_prototype_->SetConstructor(*function_fun);
1274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    strict_function_map_writable_prototype_->SetConstructor(*function_fun);
1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- A r r a y ---
1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> array_function =
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
128044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        isolate->initial_object_prototype(),
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        Builtins::kArrayCode);
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_function->shared()->DontAdaptArguments();
12833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    array_function->shared()->set_builtin_function_id(kArrayCode);
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // This seems a bit hackish, but we need to make sure Array.length
1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // is 1.
1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_function->shared()->set_length(1);
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Map> initial_map(array_function->initial_map());
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // This assert protects an optimization in
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // HGraphBuilder::JSArrayBuilder::EmitMapCode()
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(initial_map->elements_kind() == GetInitialFastElementsKind());
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(initial_map, 1);
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = static_cast<PropertyAttributes>(
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DONT_ENUM | DONT_DELETE);
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> array_length =
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::ArrayLengthInfo(isolate, attribs);
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // Add length.
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(array_length->name())), array_length,
1304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      initial_map->AppendDescriptor(&d);
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, array_function,
1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::ARRAY_FUNCTION_INDEX);
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Cache the array maps, needed by ArrayConstructorStub
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CacheInitialJSArrayMaps(native_context(), initial_map);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ArrayConstructorStub array_constructor_stub(isolate);
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Code> code = array_constructor_stub.GetCode();
1315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    array_function->shared()->SetConstructStub(*code);
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> is_arraylike = SimpleInstallFunction(
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        array_function, isolate->factory()->InternalizeUtf8String("isArray"),
1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kArrayIsArray, 1, true);
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_is_arraylike(*is_arraylike);
1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  {  // --- A r r a y I t e r a t o r ---
1324c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSObject> iterator_prototype(
1325c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        native_context()->initial_iterator_prototype());
1326c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSObject> array_iterator_prototype =
1328c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1329c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::ForceSetPrototype(array_iterator_prototype, iterator_prototype);
1330c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1331c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::AddProperty(
1332c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        array_iterator_prototype, factory->to_string_tag_symbol(),
1333c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        factory->ArrayIterator_string(),
1334c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1335c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1336c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> next = InstallFunction(
1337c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        array_iterator_prototype, "next", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1338c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        MaybeHandle<JSObject>(), Builtins::kArrayIteratorPrototypeNext);
1339c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    next->shared()->set_builtin_function_id(kArrayIteratorNext);
1340c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1341c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Set the expected parameters for %ArrayIteratorPrototype%.next to 0 (not
1342c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // including the receiver), as required by the builtin.
1343c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    next->shared()->set_internal_formal_parameter_count(0);
1344c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1345c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Set the length for the function to satisfy ECMA-262.
1346c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    next->shared()->set_length(0);
1347c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1348c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> array_iterator_function = CreateFunction(
1349c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        isolate, factory->ArrayIterator_string(),
1350c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        JS_FAST_ARRAY_VALUE_ITERATOR_TYPE, JSArrayIterator::kSize,
1351c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        array_iterator_prototype, Builtins::kIllegal);
1352c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    array_iterator_function->shared()->set_instance_class_name(
1353c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        isolate->heap()->ArrayIterator_string());
1354c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1355c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_initial_array_iterator_prototype(
1356c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        *array_iterator_prototype);
1357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_initial_array_iterator_prototype_map(
1358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        array_iterator_prototype->map());
1359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<Map> initial_map(array_iterator_function->initial_map(), isolate);
1361c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1362c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define ARRAY_ITERATOR_LIST(V)                                              \
1363c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(TYPED_ARRAY, KEY, typed_array, key)                                     \
1364c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY, KEY, fast_array, key)                                       \
1365c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY, KEY, array, key)                                         \
1366c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_ARRAY, KEY_VALUE, uint8_array, key_value)                         \
1367c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT8_ARRAY, KEY_VALUE, int8_array, key_value)                           \
1368c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT16_ARRAY, KEY_VALUE, uint16_array, key_value)                       \
1369c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT16_ARRAY, KEY_VALUE, int16_array, key_value)                         \
1370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT32_ARRAY, KEY_VALUE, uint32_array, key_value)                       \
1371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT32_ARRAY, KEY_VALUE, int32_array, key_value)                         \
1372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT32_ARRAY, KEY_VALUE, float32_array, key_value)                     \
1373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT64_ARRAY, KEY_VALUE, float64_array, key_value)                     \
1374c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_CLAMPED_ARRAY, KEY_VALUE, uint8_clamped_array, key_value)         \
1375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_SMI_ARRAY, KEY_VALUE, fast_smi_array, key_value)                   \
1376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_SMI_ARRAY, KEY_VALUE, fast_holey_smi_array, key_value)       \
1377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY, KEY_VALUE, fast_array, key_value)                           \
1378c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_ARRAY, KEY_VALUE, fast_holey_array, key_value)               \
1379c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_DOUBLE_ARRAY, KEY_VALUE, fast_double_array, key_value)             \
1380c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_DOUBLE_ARRAY, KEY_VALUE, fast_holey_double_array, key_value) \
1381c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY, KEY_VALUE, array, key_value)                             \
1382c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_ARRAY, VALUE, uint8_array, value)                                 \
1383c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT8_ARRAY, VALUE, int8_array, value)                                   \
1384c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT16_ARRAY, VALUE, uint16_array, value)                               \
1385c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT16_ARRAY, VALUE, int16_array, value)                                 \
1386c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT32_ARRAY, VALUE, uint32_array, value)                               \
1387c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(INT32_ARRAY, VALUE, int32_array, value)                                 \
1388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT32_ARRAY, VALUE, float32_array, value)                             \
1389c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FLOAT64_ARRAY, VALUE, float64_array, value)                             \
1390c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(UINT8_CLAMPED_ARRAY, VALUE, uint8_clamped_array, value)                 \
1391c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_SMI_ARRAY, VALUE, fast_smi_array, value)                           \
1392c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_SMI_ARRAY, VALUE, fast_holey_smi_array, value)               \
1393c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_ARRAY, VALUE, fast_array, value)                                   \
1394c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_ARRAY, VALUE, fast_holey_array, value)                       \
1395c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_DOUBLE_ARRAY, VALUE, fast_double_array, value)                     \
1396c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(FAST_HOLEY_DOUBLE_ARRAY, VALUE, fast_holey_double_array, value)         \
1397c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(GENERIC_ARRAY, VALUE, array, value)
1398c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1399c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define CREATE_ARRAY_ITERATOR_MAP(PREFIX, SUFFIX, prefix, suffix)           \
1400c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  do {                                                                      \
1401c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    const InstanceType type = JS_##PREFIX##_##SUFFIX##_ITERATOR_TYPE;       \
1402c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<Map> map =                                                       \
1403c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Map::Copy(initial_map, "JS_" #PREFIX "_" #SUFFIX "_ITERATOR_TYPE"); \
1404c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    map->set_instance_type(type);                                           \
1405c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_##prefix##_##suffix##_iterator_map(*map);         \
1406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  } while (0);
1407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    ARRAY_ITERATOR_LIST(CREATE_ARRAY_ITERATOR_MAP)
1409c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1410c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#undef CREATE_ARRAY_ITERATOR_MAP
1411c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#undef ARRAY_ITERATOR_LIST
1412c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
1413c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- N u m b e r ---
1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> number_fun = InstallFunction(
1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Number", JS_VALUE_TYPE, JSValue::kSize,
1417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kNumberConstructor);
1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    number_fun->shared()->DontAdaptArguments();
1419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    number_fun->shared()->SetConstructStub(
1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->NumberConstructor_ConstructStub());
1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    number_fun->shared()->set_length(1);
1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, number_fun,
1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::NUMBER_FUNCTION_INDEX);
1424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1425f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Create the %NumberPrototype%
1426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSValue> prototype =
1427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Handle<JSValue>::cast(factory->NewJSObject(number_fun, TENURED));
1428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    prototype->set_value(Smi::kZero);
1429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Accessors::FunctionSetPrototype(number_fun, prototype).Assert();
1430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install the "constructor" property on the {prototype}.
1432f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), number_fun,
1433f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          DONT_ENUM);
1434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install the Number.prototype methods.
1436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toExponential",
1437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeToExponential, 1, false);
1438f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toFixed",
1439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeToFixed, 1, false);
1440f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toPrecision",
1441f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeToPrecision, 1, false);
1442f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toString",
1443f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeToString, 1, false);
1444f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "valueOf",
1445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeValueOf, 0, true);
1446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install i18n fallback functions.
1448f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toLocaleString",
1449f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kNumberPrototypeToLocaleString, 0, false);
1450f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    // Install the Number functions.
1452f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(number_fun, "isFinite", Builtins::kNumberIsFinite, 1,
1453f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          true);
1454f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(number_fun, "isInteger", Builtins::kNumberIsInteger,
1455f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          1, true);
1456f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(number_fun, "isNaN", Builtins::kNumberIsNaN, 1, true);
1457f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(number_fun, "isSafeInteger",
1458f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kNumberIsSafeInteger, 1, true);
1459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Install Number.parseFloat and Global.parseFloat.
1461c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> parse_float_fun = SimpleInstallFunction(
1462c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        number_fun, "parseFloat", Builtins::kNumberParseFloat, 1, true);
1463c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::AddProperty(global_object,
1464c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          factory->NewStringFromAsciiChecked("parseFloat"),
1465c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          parse_float_fun, DONT_ENUM);
1466c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1467c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Install Number.parseInt and Global.parseInt.
1468c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> parse_int_fun = SimpleInstallFunction(
1469c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        number_fun, "parseInt", Builtins::kNumberParseInt, 2, true);
1470c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::AddProperty(global_object,
1471c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          factory->NewStringFromAsciiChecked("parseInt"),
1472c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          parse_int_fun, DONT_ENUM);
1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- B o o l e a n ---
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> boolean_fun =
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
147844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        isolate->initial_object_prototype(),
1479109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        Builtins::kBooleanConstructor);
1480109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    boolean_fun->shared()->DontAdaptArguments();
1481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    boolean_fun->shared()->SetConstructStub(
1482109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        *isolate->builtins()->BooleanConstructor_ConstructStub());
1483109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    boolean_fun->shared()->set_length(1);
1484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, boolean_fun,
1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::BOOLEAN_FUNCTION_INDEX);
1486109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1487109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the %BooleanPrototype%
1488109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSValue> prototype =
1489109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        Handle<JSValue>::cast(factory->NewJSObject(boolean_fun, TENURED));
1490109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    prototype->set_value(isolate->heap()->false_value());
1491109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Accessors::FunctionSetPrototype(boolean_fun, prototype).Assert();
1492109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1493109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the "constructor" property on the {prototype}.
1494109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), boolean_fun,
1495109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          DONT_ENUM);
1496109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1497109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the Boolean.prototype methods.
1498109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(prototype, "toString",
1499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kBooleanPrototypeToString, 0, true);
1500109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(prototype, "valueOf",
1501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kBooleanPrototypeValueOf, 0, true);
1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- S t r i n g ---
1505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> string_fun = InstallFunction(
1506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "String", JS_VALUE_TYPE, JSValue::kSize,
1507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kStringConstructor);
1508f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    string_fun->shared()->SetConstructStub(
1509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->StringConstructor_ConstructStub());
1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    string_fun->shared()->DontAdaptArguments();
1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    string_fun->shared()->set_length(1);
1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, string_fun,
1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::STRING_FUNCTION_INDEX);
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Map> string_map =
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Map>(native_context()->string_function()->initial_map());
1517109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    string_map->set_elements_kind(FAST_STRING_WRAPPER_ELEMENTS);
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(string_map, 1);
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = static_cast<PropertyAttributes>(
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DONT_ENUM | DONT_DELETE | READ_ONLY);
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> string_length(
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::StringLengthInfo(isolate, attribs));
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // Add length.
1526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory->length_string(), string_length,
1527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   attribs);
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      string_map->AppendDescriptor(&d);
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
15303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // Install the String.fromCharCode function.
15323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(string_fun, "fromCharCode",
1533c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kStringFromCharCode, 1, false);
153413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
153513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the String.fromCodePoint function.
153613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(string_fun, "fromCodePoint",
153713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          Builtins::kStringFromCodePoint, 1, false);
1538bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1539bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Create the %StringPrototype%
1540bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSValue> prototype =
1541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Handle<JSValue>::cast(factory->NewJSObject(string_fun, TENURED));
1542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    prototype->set_value(isolate->heap()->empty_string());
1543bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Accessors::FunctionSetPrototype(string_fun, prototype).Assert();
1544bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1545bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Install the "constructor" property on the {prototype}.
1546bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), string_fun,
1547bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          DONT_ENUM);
1548bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1549bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Install the String.prototype methods.
1550bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(prototype, "charAt", Builtins::kStringPrototypeCharAt,
1551bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          1, true);
1552bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SimpleInstallFunction(prototype, "charCodeAt",
1553bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                          Builtins::kStringPrototypeCharCodeAt, 1, true);
1554c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(prototype, "endsWith",
1555c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kStringPrototypeEndsWith, 1, false);
1556c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(prototype, "includes",
1557c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kStringPrototypeIncludes, 1, false);
1558c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(prototype, "indexOf",
1559c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kStringPrototypeIndexOf, 1, false);
1560f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "lastIndexOf",
1561f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kStringPrototypeLastIndexOf, 1, false);
1562f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "localeCompare",
1563f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kStringPrototypeLocaleCompare, 1, true);
1564f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "normalize",
1565f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kStringPrototypeNormalize, 0, false);
1566f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "substr", Builtins::kStringPrototypeSubstr,
1567f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          2, true);
1568f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "substring",
1569f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kStringPrototypeSubstring, 2, true);
1570c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(prototype, "startsWith",
1571c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kStringPrototypeStartsWith, 1, false);
1572f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toString",
1573f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kStringPrototypeToString, 0, true);
157413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(prototype, "trim", Builtins::kStringPrototypeTrim, 0,
157513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          false);
157613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(prototype, "trimLeft",
157713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          Builtins::kStringPrototypeTrimLeft, 0, false);
157813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(prototype, "trimRight",
157913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          Builtins::kStringPrototypeTrimRight, 0, false);
1580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "valueOf",
1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kStringPrototypeValueOf, 0, true);
1582f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1583f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSFunction> iterator = SimpleCreateFunction(
1584f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        isolate, factory->NewStringFromAsciiChecked("[Symbol.iterator]"),
1585f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        Builtins::kStringPrototypeIterator, 0, true);
1586f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    iterator->shared()->set_native(true);
1587c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    iterator->shared()->set_builtin_function_id(kStringIterator);
1588f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    JSObject::AddProperty(prototype, factory->iterator_symbol(), iterator,
1589f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          static_cast<PropertyAttributes>(DONT_ENUM));
1590f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1591f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1592f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  {  // --- S t r i n g I t e r a t o r ---
1593f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSObject> iterator_prototype(
1594f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        native_context()->initial_iterator_prototype());
1595f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1596f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSObject> string_iterator_prototype =
1597f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1598f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    JSObject::ForceSetPrototype(string_iterator_prototype, iterator_prototype);
1599f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1600f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    JSObject::AddProperty(
1601f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        string_iterator_prototype, factory->to_string_tag_symbol(),
1602f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        factory->NewStringFromAsciiChecked("String Iterator"),
1603f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1604f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSFunction> next =
1606f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        InstallFunction(string_iterator_prototype, "next", JS_OBJECT_TYPE,
1607f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1608f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        Builtins::kStringIteratorPrototypeNext);
1609f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    next->shared()->set_builtin_function_id(kStringIteratorNext);
1610f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1611f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    // Set the expected parameters for %StringIteratorPrototype%.next to 0 (not
1612f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    // including the receiver), as required by the builtin.
1613f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    next->shared()->set_internal_formal_parameter_count(0);
1614f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1615f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    // Set the length for the function to satisfy ECMA-262.
1616f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    next->shared()->set_length(0);
1617f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1618f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSFunction> string_iterator_function = CreateFunction(
1619f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        isolate, factory->NewStringFromAsciiChecked("StringIterator"),
1620f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        JS_STRING_ITERATOR_TYPE, JSStringIterator::kSize,
1621f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        string_iterator_prototype, Builtins::kIllegal);
1622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    native_context()->set_string_iterator_map(
1623f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        string_iterator_function->initial_map());
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // --- S y m b o l ---
1628109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSObject> prototype =
1629109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1630109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> symbol_fun =
1631109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
1632109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        prototype, Builtins::kSymbolConstructor);
1633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    symbol_fun->shared()->SetConstructStub(
1634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->SymbolConstructor_ConstructStub());
16353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    symbol_fun->shared()->set_length(0);
1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    symbol_fun->shared()->DontAdaptArguments();
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_symbol_function(*symbol_fun);
1638109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1639f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install the @@toStringTag property on the {prototype}.
1640f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(
1641f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        prototype, factory->to_string_tag_symbol(),
1642f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        factory->NewStringFromAsciiChecked("Symbol"),
1643f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1645109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Install the "constructor" property on the {prototype}.
1646109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), symbol_fun,
1647109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                          DONT_ENUM);
1648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install the Symbol.prototype methods.
1650f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "toString",
1651f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kSymbolPrototypeToString, 0, true);
1652f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(prototype, "valueOf",
1653f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          Builtins::kSymbolPrototypeValueOf, 0, true);
1654f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1655f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Install the @@toPrimitive function.
1656f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSFunction> to_primitive = InstallFunction(
1657f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE,
1658f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1659f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Builtins::kSymbolPrototypeToPrimitive,
1660f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1661f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1662f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Set the expected parameters for @@toPrimitive to 1; required by builtin.
1663f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    to_primitive->shared()->set_internal_formal_parameter_count(1);
1664f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1665f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Set the length for the function to satisfy ECMA-262.
1666f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    to_primitive->shared()->set_length(1);
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- D a t e ---
1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for Date.prototype.
1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> prototype =
1672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> date_fun =
1674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, prototype,
1675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Builtins::kDateConstructor);
1676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, date_fun,
1677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::DATE_FUNCTION_INDEX);
1678f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    date_fun->shared()->SetConstructStub(
1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->DateConstructor_ConstructStub());
1680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    date_fun->shared()->set_length(7);
1681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    date_fun->shared()->DontAdaptArguments();
1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the Date.now, Date.parse and Date.UTC functions.
1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "now", Builtins::kDateNow, 0, false);
1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "parse", Builtins::kDateParse, 1, false);
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(date_fun, "UTC", Builtins::kDateUTC, 7, false);
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the "constructor" property on the {prototype}.
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(), date_fun,
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          DONT_ENUM);
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the Date.prototype methods.
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toString",
1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToString, 0, false);
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toDateString",
1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToDateString, 0, false);
1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toTimeString",
1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToTimeString, 0, false);
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toISOString",
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToISOString, 0, false);
1701109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSFunction> to_utc_string =
1702109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        SimpleInstallFunction(prototype, "toUTCString",
1703109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                              Builtins::kDatePrototypeToUTCString, 0, false);
1704109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    InstallFunction(prototype, to_utc_string,
1705109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                    factory->InternalizeUtf8String("toGMTString"), DONT_ENUM);
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getDate", Builtins::kDatePrototypeGetDate,
1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setDate", Builtins::kDatePrototypeSetDate,
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getDay", Builtins::kDatePrototypeGetDay,
1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getFullYear",
1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetFullYear, 0, true);
1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setFullYear",
1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetFullYear, 3, false);
1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getHours",
1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetHours, 0, true);
1718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setHours",
1719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetHours, 4, false);
1720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMilliseconds",
1721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMilliseconds, 0, true);
1722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMilliseconds",
1723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMilliseconds, 1, false);
1724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMinutes",
1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMinutes, 0, true);
1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMinutes",
1727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMinutes, 3, false);
1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getMonth",
1729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetMonth, 0, true);
1730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setMonth",
1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetMonth, 2, false);
1732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getSeconds",
1733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetSeconds, 0, true);
1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setSeconds",
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetSeconds, 2, false);
1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getTime", Builtins::kDatePrototypeGetTime,
1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setTime", Builtins::kDatePrototypeSetTime,
1739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getTimezoneOffset",
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetTimezoneOffset, 0, true);
1742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCDate",
1743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCDate, 0, true);
1744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCDate",
1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCDate, 1, false);
1746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCDay",
1747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCDay, 0, true);
1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCFullYear",
1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCFullYear, 0, true);
1750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCFullYear",
1751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCFullYear, 3, false);
1752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCHours",
1753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCHours, 0, true);
1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCHours",
1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCHours, 4, false);
1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMilliseconds",
1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMilliseconds, 0, true);
1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMilliseconds",
1759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMilliseconds, 1, false);
1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMinutes",
1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMinutes, 0, true);
1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMinutes",
1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMinutes, 3, false);
1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCMonth",
1765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCMonth, 0, true);
1766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCMonth",
1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCMonth, 2, false);
1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getUTCSeconds",
1769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeGetUTCSeconds, 0, true);
1770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setUTCSeconds",
1771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeSetUTCSeconds, 2, false);
1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "valueOf", Builtins::kDatePrototypeValueOf,
1773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, false);
1774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "getYear", Builtins::kDatePrototypeGetYear,
1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          0, true);
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "setYear", Builtins::kDatePrototypeSetYear,
1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          1, false);
177813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(prototype, "toJSON", Builtins::kDatePrototypeToJson,
177913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          1, false);
1780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install i18n fallback functions.
1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleString",
1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToString, 0, false);
1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleDateString",
1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToDateString, 0, false);
1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimpleInstallFunction(prototype, "toLocaleTimeString",
1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          Builtins::kDatePrototypeToTimeString, 0, false);
1788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Install the @@toPrimitive function.
1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> to_primitive = InstallFunction(
1791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE,
1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Builtins::kDatePrototypeToPrimitive,
1794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the expected parameters for @@toPrimitive to 1; required by builtin.
1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_primitive->shared()->set_internal_formal_parameter_count(1);
1798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the length for the function to satisfy ECMA-262.
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_primitive->shared()->set_length(1);
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- R e g E x p
1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for RegExp.prototype.
1805f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<JSObject> prototype =
1806f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> regexp_fun =
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
1809f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        prototype, Builtins::kRegExpConstructor);
1810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, regexp_fun,
1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::REGEXP_FUNCTION_INDEX);
1812f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1813f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<SharedFunctionInfo> shared(regexp_fun->shared(), isolate);
1814f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    shared->SetConstructStub(*isolate->builtins()->RegExpConstructor());
1815f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    shared->set_instance_class_name(isolate->heap()->RegExp_string());
1816f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    shared->DontAdaptArguments();
1817f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    shared->set_length(2);
1818f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1819c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {
1820c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // RegExp.prototype setup.
1821f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1822c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Install the "constructor" property on the {prototype}.
1823c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      JSObject::AddProperty(prototype, factory->constructor_string(),
1824c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            regexp_fun, DONT_ENUM);
1825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1826c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      {
1827c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Handle<JSFunction> fun = SimpleInstallFunction(
1828c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            prototype, factory->exec_string(), Builtins::kRegExpPrototypeExec,
1829c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            1, true, DONT_ENUM);
1830c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        native_context()->set_regexp_exec_function(*fun);
1831c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
1832c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1833c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->flags_string(),
1834c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeFlagsGetter, true);
1835c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->global_string(),
1836c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeGlobalGetter, true);
1837c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->ignoreCase_string(),
1838c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeIgnoreCaseGetter, true);
1839c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->multiline_string(),
1840c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeMultilineGetter, true);
1841c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->source_string(),
1842c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeSourceGetter, false);
1843c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->sticky_string(),
1844c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeStickyGetter, true);
1845c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(prototype, factory->unicode_string(),
1846c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeUnicodeGetter, true);
1847c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1848c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallFunction(prototype, "compile",
1849c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            Builtins::kRegExpPrototypeCompile, 2, false,
1850c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            DONT_ENUM);
1851c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallFunction(prototype, factory->toString_string(),
1852c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            Builtins::kRegExpPrototypeToString, 0, false,
1853c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            DONT_ENUM);
1854c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallFunction(prototype, "test", Builtins::kRegExpPrototypeTest,
1855c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            1, true, DONT_ENUM);
1856c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1857c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      {
1858c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Handle<JSFunction> fun = SimpleCreateFunction(
1859c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            isolate, factory->InternalizeUtf8String("[Symbol.match]"),
1860c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            Builtins::kRegExpPrototypeMatch, 1, false);
1861c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        InstallFunction(prototype, fun, factory->match_symbol(), DONT_ENUM);
1862c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
1863c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1864c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      {
1865c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Handle<JSFunction> fun = SimpleCreateFunction(
1866c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            isolate, factory->InternalizeUtf8String("[Symbol.replace]"),
1867c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            Builtins::kRegExpPrototypeReplace, 2, true);
1868c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        InstallFunction(prototype, fun, factory->replace_symbol(), DONT_ENUM);
1869c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
1870c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1871c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      {
1872c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Handle<JSFunction> fun = SimpleCreateFunction(
1873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            isolate, factory->InternalizeUtf8String("[Symbol.search]"),
1874c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            Builtins::kRegExpPrototypeSearch, 1, true);
1875c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        InstallFunction(prototype, fun, factory->search_symbol(), DONT_ENUM);
1876c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
1877c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1878c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      {
1879c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        Handle<JSFunction> fun = SimpleCreateFunction(
1880c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            isolate, factory->InternalizeUtf8String("[Symbol.split]"),
1881c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            Builtins::kRegExpPrototypeSplit, 2, false);
1882c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        InstallFunction(prototype, fun, factory->split_symbol(), DONT_ENUM);
1883c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
1884c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1885c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Store the initial RegExp.prototype map. This is used in fast-path
1886c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // checks. Do not alter the prototype after this point.
1887c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      native_context()->set_regexp_prototype_map(prototype->map());
1888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1889c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1890c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {
1891c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // RegExp getters and setters.
1892c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1893c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetter(regexp_fun,
1894c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          factory->InternalizeUtf8String("[Symbol.species]"),
1895c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          factory->species_symbol(),
1896c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          Builtins::kRegExpPrototypeSpeciesGetter, false);
1897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1898c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Static properties set by a successful match.
1899c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1900c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      const PropertyAttributes no_enum = DONT_ENUM;
1901c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(regexp_fun, factory->input_string(),
1902c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpInputGetter,
1903c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpInputSetter, no_enum);
1904c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(
1905c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          regexp_fun, factory->InternalizeUtf8String("$_"),
1906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kRegExpInputGetter, Builtins::kRegExpInputSetter, no_enum);
1907c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(
1909c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          regexp_fun, factory->InternalizeUtf8String("lastMatch"),
1910c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kRegExpLastMatchGetter, Builtins::kEmptyFunction, no_enum);
1911c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(
1912c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          regexp_fun, factory->InternalizeUtf8String("$&"),
1913c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kRegExpLastMatchGetter, Builtins::kEmptyFunction, no_enum);
1914c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(
1916c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          regexp_fun, factory->InternalizeUtf8String("lastParen"),
1917c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kRegExpLastParenGetter, Builtins::kEmptyFunction, no_enum);
1918c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(
1919c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          regexp_fun, factory->InternalizeUtf8String("$+"),
1920c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kRegExpLastParenGetter, Builtins::kEmptyFunction, no_enum);
1921c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1922c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(regexp_fun,
1923c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                factory->InternalizeUtf8String("leftContext"),
1924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpLeftContextGetter,
1925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kEmptyFunction, no_enum);
1926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(regexp_fun,
1927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                factory->InternalizeUtf8String("$`"),
1928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpLeftContextGetter,
1929c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kEmptyFunction, no_enum);
1930c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(regexp_fun,
1932c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                factory->InternalizeUtf8String("rightContext"),
1933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpRightContextGetter,
1934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kEmptyFunction, no_enum);
1935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      SimpleInstallGetterSetter(regexp_fun,
1936c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                factory->InternalizeUtf8String("$'"),
1937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kRegExpRightContextGetter,
1938c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                Builtins::kEmptyFunction, no_enum);
1939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1940c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define INSTALL_CAPTURE_GETTER(i)                         \
1941c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SimpleInstallGetterSetter(                              \
1942c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      regexp_fun, factory->InternalizeUtf8String("$" #i), \
1943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Builtins::kRegExpCapture##i##Getter, Builtins::kEmptyFunction, no_enum)
1944c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(1);
1945c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(2);
1946c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(3);
1947c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(4);
1948c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(5);
1949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(6);
1950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(7);
1951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(8);
1952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      INSTALL_CAPTURE_GETTER(9);
1953c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#undef INSTALL_CAPTURE_GETTER
1954c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
19556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(regexp_fun->has_initial_map());
19576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<Map> initial_map(regexp_fun->initial_map());
19586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(0, initial_map->GetInObjectProperties());
19606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(initial_map, 1);
1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // ECMA-262, section 15.10.7.5.
1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PropertyAttributes writable =
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
1966c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DataDescriptor field(factory->lastIndex_string(),
1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         JSRegExp::kLastIndexFieldIndex, writable,
1968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         Representation::Tagged());
1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->AppendDescriptor(&field);
19706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    static const int num_fields = JSRegExp::kInObjectFieldCount;
1972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetInObjectProperties(num_fields);
19736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_unused_property_fields(0);
1974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    initial_map->set_instance_size(initial_map->instance_size() +
1975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                   num_fields * kPointerSize);
1976c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1977c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {  // Internal: RegExpInternalMatch
1978c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Handle<JSFunction> function =
1979c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          factory->NewFunction(isolate->factory()->empty_string(),
1980c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               isolate->builtins()->RegExpInternalMatch(),
1981c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               JS_OBJECT_TYPE, JSObject::kHeaderSize);
1982c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      function->shared()->set_internal_formal_parameter_count(2);
1983c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      function->shared()->set_length(2);
1984c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      function->shared()->set_native(true);
1985c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      native_context()->set(Context::REGEXP_INTERNAL_MATCH, *function);
1986c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1987c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1988c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Create the last match info. One for external use, and one for internal
1989c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // use when we don't want to modify the externally visible match info.
1990c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<RegExpMatchInfo> last_match_info = factory->NewRegExpMatchInfo();
1991c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_regexp_last_match_info(*last_match_info);
1992c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<RegExpMatchInfo> internal_match_info = factory->NewRegExpMatchInfo();
1993c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_regexp_internal_match_info(*internal_match_info);
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- E r r o r
1997f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->Error_string(),
1998f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::ERROR_FUNCTION_INDEX);
1999f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallMakeError(isolate, isolate->builtins()->MakeError(),
2000f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     Context::MAKE_ERROR_INDEX);
2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- E v a l E r r o r
2004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->EvalError_string(),
2005f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::EVAL_ERROR_FUNCTION_INDEX);
2006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- R a n g e E r r o r
2009f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->RangeError_string(),
2010f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::RANGE_ERROR_FUNCTION_INDEX);
2011f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallMakeError(isolate, isolate->builtins()->MakeRangeError(),
2012f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     Context::MAKE_RANGE_ERROR_INDEX);
2013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- R e f e r e n c e E r r o r
2016f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->ReferenceError_string(),
2017f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::REFERENCE_ERROR_FUNCTION_INDEX);
2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S y n t a x E r r o r
2021f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->SyntaxError_string(),
2022f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::SYNTAX_ERROR_FUNCTION_INDEX);
2023f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallMakeError(isolate, isolate->builtins()->MakeSyntaxError(),
2024f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     Context::MAKE_SYNTAX_ERROR_INDEX);
2025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- T y p e E r r o r
2028f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->TypeError_string(),
2029f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::TYPE_ERROR_FUNCTION_INDEX);
2030f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallMakeError(isolate, isolate->builtins()->MakeTypeError(),
2031f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     Context::MAKE_TYPE_ERROR_INDEX);
2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- U R I E r r o r
2035f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallError(isolate, global, factory->URIError_string(),
2036f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 Context::URI_ERROR_FUNCTION_INDEX);
2037f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstallMakeError(isolate, isolate->builtins()->MakeURIError(),
2038f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     Context::MAKE_URI_ERROR_INDEX);
2039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2041c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  {  // -- C o m p i l e E r r o r
2042c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSObject> dummy = factory->NewJSObject(isolate->object_function());
2043c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    InstallError(isolate, dummy, factory->CompileError_string(),
2044c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                 Context::WASM_COMPILE_ERROR_FUNCTION_INDEX);
2045c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2046c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // -- R u n t i m e E r r o r
2047c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    InstallError(isolate, dummy, factory->RuntimeError_string(),
2048c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                 Context::WASM_RUNTIME_ERROR_FUNCTION_INDEX);
2049c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
2050c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Initialize the embedder data slot.
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> embedder_data = factory->NewFixedArray(3);
2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_embedder_data(*embedder_data);
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- J S O N
2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = factory->InternalizeUtf8String("JSON");
2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> cons = factory->NewFunction(name);
2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInstancePrototype(cons,
2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Object>(native_context()->initial_object_prototype(), isolate));
2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED);
2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(json_object->IsJSObject());
2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(global, name, json_object, DONT_ENUM);
206313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(json_object, "parse", Builtins::kJsonParse, 2, false);
206413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(json_object, "stringify", Builtins::kJsonStringify, 3,
206513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          true);
206613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
206713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        json_object, factory->to_string_tag_symbol(),
206813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewStringFromAsciiChecked("JSON"),
206913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a t h
2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> name = factory->InternalizeUtf8String("Math");
2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> cons = factory->NewFunction(name);
2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSFunction::SetInstancePrototype(
2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        cons,
2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Object>(native_context()->initial_object_prototype(), isolate));
2078109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<JSObject> math = factory->NewJSObject(cons, TENURED);
2079109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK(math->IsJSObject());
2080109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSObject::AddProperty(global, name, math, DONT_ENUM);
2081f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "abs", Builtins::kMathAbs, 1, true);
20823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "acos", Builtins::kMathAcos, 1, true);
2083f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "acosh", Builtins::kMathAcosh, 1, true);
20843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "asin", Builtins::kMathAsin, 1, true);
2085f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "asinh", Builtins::kMathAsinh, 1, true);
20863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "atan", Builtins::kMathAtan, 1, true);
208713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "atanh", Builtins::kMathAtanh, 1, true);
2088f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "atan2", Builtins::kMathAtan2, 2, true);
20893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "ceil", Builtins::kMathCeil, 1, true);
209013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "cbrt", Builtins::kMathCbrt, 1, true);
209113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "expm1", Builtins::kMathExpm1, 1, true);
20923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "clz32", Builtins::kMathClz32, 1, true);
209313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "cos", Builtins::kMathCos, 1, true);
2094f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "cosh", Builtins::kMathCosh, 1, true);
2095f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "exp", Builtins::kMathExp, 1, true);
20963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> math_floor =
20973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(math, "floor", Builtins::kMathFloor, 1, true);
20983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_math_floor(*math_floor);
20993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "fround", Builtins::kMathFround, 1, true);
2100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "hypot", Builtins::kMathHypot, 2, false);
21013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "imul", Builtins::kMathImul, 2, true);
2102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "log", Builtins::kMathLog, 1, true);
210313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "log1p", Builtins::kMathLog1p, 1, true);
210413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "log2", Builtins::kMathLog2, 1, true);
210513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "log10", Builtins::kMathLog10, 1, true);
2106109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(math, "max", Builtins::kMathMax, 2, false);
2107109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SimpleInstallFunction(math, "min", Builtins::kMathMin, 2, false);
2108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSFunction> math_pow =
2109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        SimpleInstallFunction(math, "pow", Builtins::kMathPow, 2, true);
2110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    native_context()->set_math_pow(*math_pow);
2111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SimpleInstallFunction(math, "random", Builtins::kMathRandom, 0, true);
21123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "round", Builtins::kMathRound, 1, true);
2113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "sign", Builtins::kMathSign, 1, true);
211413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "sin", Builtins::kMathSin, 1, true);
2115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "sinh", Builtins::kMathSinh, 1, true);
2116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "sqrt", Builtins::kMathSqrt, 1, true);
211713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallFunction(math, "tan", Builtins::kMathTan, 1, true);
2118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    SimpleInstallFunction(math, "tanh", Builtins::kMathTanh, 1, true);
21193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(math, "trunc", Builtins::kMathTrunc, 1, true);
212013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
212113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install math constants.
212213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    double const kE = base::ieee754::exp(1.0);
2123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    double const kPI = 3.1415926535897932;
212413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
212513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        math, factory->NewStringFromAsciiChecked("E"), factory->NewNumber(kE),
212613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
212713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
212813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        math, factory->NewStringFromAsciiChecked("LN10"),
212913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewNumber(base::ieee754::log(10.0)),
213013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
213113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
213213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        math, factory->NewStringFromAsciiChecked("LN2"),
213313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewNumber(base::ieee754::log(2.0)),
213413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
213513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
213613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        math, factory->NewStringFromAsciiChecked("LOG10E"),
213713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewNumber(base::ieee754::log10(kE)),
213813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
213913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
214013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        math, factory->NewStringFromAsciiChecked("LOG2E"),
214113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewNumber(base::ieee754::log2(kE)),
214213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
2143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(
2144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        math, factory->NewStringFromAsciiChecked("PI"), factory->NewNumber(kPI),
2145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
2146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(
2147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        math, factory->NewStringFromAsciiChecked("SQRT1_2"),
2148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        factory->NewNumber(std::sqrt(0.5)),
2149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
2150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::AddProperty(
2151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        math, factory->NewStringFromAsciiChecked("SQRT2"),
2152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        factory->NewNumber(std::sqrt(2.0)),
2153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
2154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::AddProperty(
2155c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        math, factory->to_string_tag_symbol(),
2156c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        factory->NewStringFromAsciiChecked("Math"),
2157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // -- A r r a y B u f f e r
2161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSFunction> array_buffer_fun = InstallArrayBuffer(
2162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        global, "ArrayBuffer", Builtins::kArrayBufferPrototypeGetByteLength,
2163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        BuiltinFunctionId::kArrayBufferByteLength);
2164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, array_buffer_fun,
2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::ARRAY_BUFFER_FUN_INDEX);
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
216813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  {  // -- T y p e d A r r a y
216913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<JSObject> prototype =
217013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
217113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    native_context()->set_typed_array_prototype(*prototype);
217213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
217313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<JSFunction> typed_array_fun =
217413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        CreateFunction(isolate, factory->InternalizeUtf8String("TypedArray"),
217513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                       JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, prototype,
217613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                       Builtins::kIllegal);
217713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
217813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the "constructor" property on the {prototype}.
217913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(),
218013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          typed_array_fun, DONT_ENUM);
218113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    native_context()->set_typed_array_function(*typed_array_fun);
218213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
218313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the "buffer", "byteOffset", "byteLength" and "length"
218413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // getters on the {prototype}.
218513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->buffer_string(),
218613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kTypedArrayPrototypeBuffer, false);
218713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->byte_length_string(),
218813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kTypedArrayPrototypeByteLength, true,
218913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kTypedArrayByteLength);
219013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->byte_offset_string(),
219113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kTypedArrayPrototypeByteOffset, true,
219213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kTypedArrayByteOffset);
219313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->length_string(),
219413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kTypedArrayPrototypeLength, true,
219513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kTypedArrayLength);
2196c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2197c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Install "keys", "values" and "entries" methods on the {prototype}.
2198c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> entries =
2199c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        SimpleInstallFunction(prototype, factory->entries_string(),
2200c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              Builtins::kTypedArrayPrototypeEntries, 0, true);
2201c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    entries->shared()->set_builtin_function_id(kTypedArrayEntries);
2202c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2203c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> keys =
2204c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        SimpleInstallFunction(prototype, factory->keys_string(),
2205c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              Builtins::kTypedArrayPrototypeKeys, 0, true);
2206c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    keys->shared()->set_builtin_function_id(kTypedArrayKeys);
2207c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2208c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> values =
2209c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        SimpleInstallFunction(prototype, factory->values_string(),
2210c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              Builtins::kTypedArrayPrototypeValues, 0, true);
2211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    values->shared()->set_builtin_function_id(kTypedArrayValues);
2212c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSObject::AddProperty(prototype, factory->iterator_symbol(), values,
2213c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          DONT_ENUM);
221413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
221513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // -- T y p e d A r r a y s
2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size)             \
2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                                    \
2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> fun;                                            \
2220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallTypedArray(#Type "Array", TYPE##_ELEMENTS, &fun);           \
2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, fun,                     \
2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::TYPE##_ARRAY_FUN_INDEX); \
2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef INSTALL_TYPED_ARRAY
222613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
222813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  {  // -- D a t a V i e w
222913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<JSObject> prototype =
223013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
223113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<JSFunction> data_view_fun =
223213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        InstallFunction(global, "DataView", JS_DATA_VIEW_TYPE,
223313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        JSDataView::kSizeWithInternalFields, prototype,
223413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kDataViewConstructor);
2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, data_view_fun,
2236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::DATA_VIEW_FUN_INDEX);
2237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    data_view_fun->shared()->SetConstructStub(
2238109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        *isolate->builtins()->DataViewConstructor_ConstructStub());
2239109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    data_view_fun->shared()->set_length(3);
2240109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    data_view_fun->shared()->DontAdaptArguments();
224113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
224213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the @@toStringTag property on the {prototype}.
224313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(
224413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        prototype, factory->to_string_tag_symbol(),
224513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        factory->NewStringFromAsciiChecked("DataView"),
224613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
224713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
224813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the "constructor" property on the {prototype}.
224913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    JSObject::AddProperty(prototype, factory->constructor_string(),
225013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                          data_view_fun, DONT_ENUM);
225113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
225213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Install the "buffer", "byteOffset" and "byteLength" getters
225313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // on the {prototype}.
225413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->buffer_string(),
225513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kDataViewPrototypeGetBuffer, false,
225613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kDataViewBuffer);
225713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->byte_length_string(),
225813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kDataViewPrototypeGetByteLength, false,
225913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kDataViewByteLength);
226013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimpleInstallGetter(prototype, factory->byte_offset_string(),
226113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Builtins::kDataViewPrototypeGetByteOffset, false,
226213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        kDataViewByteOffset);
2263f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
2264f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getInt8",
2265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetInt8, 1, false);
2266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setInt8",
2267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetInt8, 2, false);
2268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getUint8",
2269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetUint8, 1, false);
2270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setUint8",
2271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetUint8, 2, false);
2272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getInt16",
2273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetInt16, 1, false);
2274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setInt16",
2275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetInt16, 2, false);
2276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getUint16",
2277f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetUint16, 1, false);
2278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setUint16",
2279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetUint16, 2, false);
2280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getInt32",
2281f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetInt32, 1, false);
2282f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setInt32",
2283f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetInt32, 2, false);
2284f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getUint32",
2285f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetUint32, 1, false);
2286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setUint32",
2287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetUint32, 2, false);
2288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getFloat32",
2289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetFloat32, 1, false);
2290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setFloat32",
2291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetFloat32, 2, false);
2292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "getFloat64",
2293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeGetFloat64, 1, false);
2294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SimpleInstallFunction(prototype, "setFloat64",
2295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          Builtins::kDataViewPrototypeSetFloat64, 2, false);
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a p
2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_map_fun = InstallFunction(
2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Map", JS_MAP_TYPE, JSMap::kSize,
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_map_fun,
2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_MAP_FUN_INDEX);
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S e t
2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_set_fun = InstallFunction(
2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "Set", JS_SET_TYPE, JSSet::kSize,
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
2310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_set_fun,
2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_SET_FUN_INDEX);
2312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2314c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  {  // -- J S M o d u l e N a m e s p a c e
2315c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<Map> map =
2316c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        factory->NewMap(JS_MODULE_NAMESPACE_TYPE, JSModuleNamespace::kSize);
2317c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Map::SetPrototype(map, isolate->factory()->null_value());
2318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Map::EnsureDescriptorSlack(map, 2);
2319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_js_module_namespace_map(*map);
2320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2321c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {  // Install @@toStringTag.
2322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      PropertyAttributes attribs =
2323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
2324c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DataConstantDescriptor d(factory->to_string_tag_symbol(),
2325c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               factory->NewStringFromAsciiChecked("Module"),
2326c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               attribs);
2327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      map->AppendDescriptor(&d);
2328c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
2329c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2330c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {  // Install @@iterator.
2331c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Handle<JSFunction> iterator = SimpleCreateFunction(
2332c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate, factory->NewStringFromAsciiChecked("[Symbol.iterator]"),
2333c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Builtins::kModuleNamespaceIterator, 0, true);
2334c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      iterator->shared()->set_native(true);
2335c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // TODO(neis): Is this really supposed to be writable?
2336c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DataConstantDescriptor d(factory->iterator_symbol(), iterator, DONT_ENUM);
2337c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      map->AppendDescriptor(&d);
2338c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
2339c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
2340c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- I t e r a t o r R e s u l t
2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map =
2343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory->NewMap(JS_OBJECT_TYPE, JSIteratorResult::kSize);
2344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, isolate->initial_object_prototype());
2345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(map, 2);
2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // value
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor d(factory->value_string(), JSIteratorResult::kValueIndex,
2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       NONE, Representation::Tagged());
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // done
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor d(factory->done_string(), JSIteratorResult::kDoneIndex,
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       NONE, Representation::Tagged());
2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2359109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
2360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(2);
2361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_iterator_result_map(*map);
2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- W e a k M a p
2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_weak_map_fun = InstallFunction(
2366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_weak_map_fun,
2369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_WEAK_MAP_FUN_INDEX);
2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- W e a k S e t
2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> js_weak_set_fun = InstallFunction(
2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->initial_object_prototype(), Builtins::kIllegal);
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate, js_weak_set_fun,
2377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::JS_WEAK_SET_FUN_INDEX);
2378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {  // -- P r o x y
23813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    CreateJSProxyMaps();
23823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
23833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<String> name = factory->Proxy_string();
23843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<Code> code(isolate->builtins()->ProxyConstructor());
23853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
23863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> proxy_function =
23873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->NewFunction(isolate->proxy_function_map(),
23883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                             factory->Proxy_string(), MaybeHandle<Code>(code));
23893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
23903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    JSFunction::SetInitialMap(
23913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        proxy_function, Handle<Map>(native_context()->proxy_map(), isolate),
23923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->null_value());
23933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    proxy_function->shared()->SetConstructStub(
23953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        *isolate->builtins()->ProxyConstructor_ConstructStub());
23963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    proxy_function->shared()->set_internal_formal_parameter_count(2);
23973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    proxy_function->shared()->set_length(2);
23983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
23993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_proxy_function(*proxy_function);
24003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    InstallFunction(global, name, proxy_function, factory->Object_string());
24013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
24023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {  // -- R e f l e c t
24043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<String> reflect_string = factory->InternalizeUtf8String("Reflect");
24053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSObject> reflect =
24063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
24073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    JSObject::AddProperty(global, reflect_string, reflect, DONT_ENUM);
24083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> define_property =
24103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->defineProperty_string(),
24113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectDefineProperty, 3, true);
24123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_define_property(*define_property);
24133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> delete_property =
24153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->deleteProperty_string(),
24163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectDeleteProperty, 2, true);
24173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_delete_property(*delete_property);
24183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> apply = SimpleInstallFunction(
24203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        reflect, factory->apply_string(), Builtins::kReflectApply, 3, false);
24213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_apply(*apply);
24223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSFunction> construct =
24243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        SimpleInstallFunction(reflect, factory->construct_string(),
24253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              Builtins::kReflectConstruct, 2, false);
24263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    native_context()->set_reflect_construct(*construct);
24273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
24283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->get_string(), Builtins::kReflectGet,
24293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          2, false);
24303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->getOwnPropertyDescriptor_string(),
24313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectGetOwnPropertyDescriptor, 2, true);
24323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->getPrototypeOf_string(),
24333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectGetPrototypeOf, 1, true);
24343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->has_string(), Builtins::kReflectHas,
24353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          2, true);
24363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->isExtensible_string(),
24373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectIsExtensible, 1, true);
24383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->ownKeys_string(),
24393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectOwnKeys, 1, true);
24403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->preventExtensions_string(),
24413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectPreventExtensions, 1, true);
24423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->set_string(), Builtins::kReflectSet,
24433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          3, false);
24443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SimpleInstallFunction(reflect, factory->setPrototypeOf_string(),
24453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                          Builtins::kReflectSetPrototypeOf, 2, true);
24463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
24473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- B o u n d F u n c t i o n
2449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map =
2450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewMap(JS_BOUND_FUNCTION_TYPE, JSBoundFunction::kSize);
2451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_is_callable();
2452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, empty_function);
2453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PropertyAttributes roc_attribs =
2455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
2456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(map, 2);
2457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2458bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<AccessorInfo> bound_length =
2459bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Accessors::BoundFunctionLengthInfo(isolate, roc_attribs);
2460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {  // length
2461bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AccessorConstantDescriptor d(factory->length_string(), bound_length,
2462bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                   roc_attribs);
2463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
2464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2465bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<AccessorInfo> bound_name =
2466bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        Accessors::BoundFunctionNameInfo(isolate, roc_attribs);
2467bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    {  // length
2468bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AccessorConstantDescriptor d(factory->name_string(), bound_name,
2469bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                   roc_attribs);
2470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
2471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2472bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    map->SetInObjectProperties(0);
2473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_bound_function_without_constructor_map(*map);
2474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "IsConstructor");
2476109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_is_constructor(true);
2477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_bound_function_with_constructor_map(*map);
2478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // --- sloppy arguments map
2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Make sure we can recognize argument objects at runtime.
2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // This is done by introducing an anonymous function with
2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // class_name equals 'Arguments'.
2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> arguments_string = factory->Arguments_string();
2485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->Illegal();
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> function = factory->NewFunctionWithoutPrototype(
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_string, code);
2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function->shared()->set_instance_class_name(*arguments_string);
2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = factory->NewMap(
249113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        JS_ARGUMENTS_TYPE, JSSloppyArgumentsObject::kSize, FAST_ELEMENTS);
2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create the descriptor array for the arguments object.
2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(map, 2);
2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // length
2496109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->length_string(),
2497109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSSloppyArgumentsObject::kLengthIndex, DONT_ENUM,
2498109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {  // callee
2502109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->callee_string(),
2503109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSSloppyArgumentsObject::kCalleeIndex, DONT_ENUM,
2504109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // @@iterator method is added later.
2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(2);
2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_sloppy_arguments_map(*map);
2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!function->has_initial_map());
2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSFunction::SetInitialMap(function, map,
2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              isolate->initial_object_prototype());
2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!map->is_dictionary_map());
2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsFastObjectElementsKind(map->elements_kind()));
2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
251944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // --- fast and slow aliased arguments map
2521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = isolate->sloppy_arguments_map();
2522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "FastAliasedArguments");
2523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS);
2524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(2, map->GetInObjectProperties());
2525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_fast_aliased_arguments_map(*map);
2526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "SlowAliasedArguments");
2528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
2529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(2, map->GetInObjectProperties());
2530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_slow_aliased_arguments_map(*map);
253144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
253244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {  // --- strict mode arguments map
253444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    const PropertyAttributes attributes =
253544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
253644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2537c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Create the ThrowTypeError function.
25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<AccessorPair> callee = factory->NewAccessorPair();
253944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> poison = GetStrictArgumentsPoisonFunction();
254144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2542c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Install the ThrowTypeError function.
2543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    callee->set_getter(*poison);
2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    callee->set_setter(*poison);
254544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create the map. Allocate one in-object field for length.
2547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = factory->NewMap(
254813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        JS_ARGUMENTS_TYPE, JSStrictArgumentsObject::kSize, FAST_ELEMENTS);
254944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Create the descriptor array for the arguments object.
2550c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Map::EnsureDescriptorSlack(map, 2);
2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    {  // length
2553109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory->length_string(),
2554109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSStrictArgumentsObject::kLengthIndex, DONT_ENUM,
2555109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
255744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
255844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    {  // callee
2559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory->callee_string(), callee,
2560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   attributes);
2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
256244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // @@iterator method is added later.
256444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK_EQ(native_context()->object_function()->prototype(),
2566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              *isolate->initial_object_prototype());
2567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(map, isolate->initial_object_prototype());
2568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetInObjectProperties(1);
256944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Copy constructor from the sloppy arguments boilerplate.
2571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->SetConstructor(
2572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context()->sloppy_arguments_map()->GetConstructor());
257344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_strict_arguments_map(*map);
2575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!map->is_dictionary_map());
2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsFastObjectElementsKind(map->elements_kind()));
2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // --- context extension
2581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Create a function for the context extension objects.
2582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->Illegal();
2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> context_extension_fun = factory->NewFunction(
2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE,
2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSObject::kHeaderSize);
2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> name = factory->InternalizeOneByteString(
2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        STATIC_CHAR_VECTOR("context_extension"));
2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    context_extension_fun->shared()->set_instance_class_name(*name);
2590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_context_extension_function(*context_extension_fun);
2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {
259569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Set up the call-as-function delegate.
2596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->HandleApiCallAsFunction();
2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> delegate = factory->NewFunction(
2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_call_as_function_delegate(*delegate);
2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    delegate->shared()->DontAdaptArguments();
2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {
260469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Set up the call-as-constructor delegate.
2605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor();
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> delegate = factory->NewFunction(
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_call_as_constructor_delegate(*delegate);
2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    delegate->shared()->DontAdaptArguments();
2610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // NOLINT(readability/fn_size)
2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind,
2614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                Handle<JSFunction>* fun) {
2615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
261613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
261713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<JSObject> typed_array_prototype =
261813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Handle<JSObject>(isolate()->typed_array_prototype());
261913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<JSFunction> typed_array_function =
262013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Handle<JSFunction>(isolate()->typed_array_function());
262113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
262213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<JSObject> prototype =
262313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
2624c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSFunction> result = InstallFunction(
2625c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSizeWithInternalFields,
2626c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      prototype, Builtins::kIllegal);
2627c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->initial_map()->set_elements_kind(elements_kind);
262813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
262913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(JSObject::SetPrototype(result, typed_array_function, false,
263013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                               Object::DONT_THROW)
263113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch            .FromJust());
263213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
263313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(JSObject::SetPrototype(prototype, typed_array_prototype, false,
263413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                               Object::DONT_THROW)
263513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch            .FromJust());
2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  *fun = result;
2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
264069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Genesis::InitializeExperimentalGlobal() {
2641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
2644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
2645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
2646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef FEATURE_INITIALIZE_GLOBAL
264769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
264869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
264969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) {
2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Vector<const char> name = Natives::GetScriptName(index);
265244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> source_code =
2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<Natives>(index);
2654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We pass in extras_utils so that builtin code can set it up for later use
2656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // by actual extras code, compiled with CompileExtraBuiltin.
2657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> utils = isolate->natives_utils_object();
2659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
2660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, utils, extras_utils};
2661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2663109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, NATIVES_CODE);
2664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExperimentalBuiltin(Isolate* isolate, int index) {
2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Vector<const char> name = ExperimentalNatives::GetScriptName(index);
2670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index);
2672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> utils = isolate->natives_utils_object();
2674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, utils};
2675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2676109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, NATIVES_CODE);
2677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) {
2681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = ExtraNatives::GetScriptName(index);
2683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExtraNatives>(index);
2685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> binding = isolate->extras_binding_object();
2687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, binding, extras_utils};
2689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2690109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, EXTENSION_CODE);
2691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileExperimentalExtraBuiltin(Isolate* isolate,
2695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                   int index) {
2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
2697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = ExperimentalExtraNatives::GetScriptName(index);
2698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source_code =
2699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->bootstrapper()->SourceLookup<ExperimentalExtraNatives>(index);
2700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> global = isolate->global_object();
2701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> binding = isolate->extras_binding_object();
2702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> extras_utils = isolate->extras_utils_object();
2703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {global, binding, extras_utils};
2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Bootstrapper::CompileNative(isolate, name, source_code,
2705109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     arraysize(args), args, EXTENSION_CODE);
2706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Bootstrapper::CompileNative(Isolate* isolate, Vector<const char> name,
2709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Handle<String> source, int argc,
2710109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                 Handle<Object> argv[],
2711109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                 NativesFlag natives_flag) {
2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SuppressDebug compiling_natives(isolate->debug());
27133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // During genesis, the boilerplate for stack overflow won't work until the
27143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // environment has been at least partially initialized. Add a stack check
27153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // before entering JS code to catch overflow early.
2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StackLimitCheck check(isolate);
2717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (check.JsHasOverflowed(1 * KB)) {
2718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    isolate->StackOverflow();
2719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return false;
2720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context(isolate->context());
2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> script_name =
2725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewStringFromUtf8(name).ToHandleChecked();
27263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<SharedFunctionInfo> function_info =
27273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Compiler::GetSharedFunctionInfoForScript(
27283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
27293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          context, NULL, NULL, ScriptCompiler::kNoCompileOptions, natives_flag,
27303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          false);
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (function_info.is_null()) return false;
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(context->IsNativeContext());
2734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> fun =
2736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info,
2737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                            context);
2738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->factory()->undefined_value();
2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // For non-extension scripts, run script to get the function wrapper.
2741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> wrapper;
2742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) {
2743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return false;
2744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Then run the function wrapper.
2746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, Handle<JSFunction>::cast(wrapper), receiver,
2747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          argc, argv).is_null();
2748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::CallUtilsFunction(Isolate* isolate, const char* name) {
2752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> utils =
2753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject>::cast(isolate->natives_utils_object());
2754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string =
2755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewStringFromAsciiChecked(name);
2756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
2757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->factory()->undefined_value();
2758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> args[] = {utils};
2759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, fun, receiver, 1, args).is_null();
2760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) {
2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory = isolate->factory();
2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
27666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<SharedFunctionInfo> function_info;
2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> source =
2769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()
2770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ->NewExternalStringFromOneByte(extension->source())
2771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          .ToHandleChecked();
2772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(source->IsOneByteRepresentation());
2773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If we can't find the function in the cache, we compile a new
2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function and insert it into the cache.
2776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Vector<const char> name = CStrVector(extension->name());
2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SourceCodeCache* cache = isolate->bootstrapper()->extensions_cache();
2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> context(isolate->context());
2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(context->IsNativeContext());
2780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!cache->Lookup(name, &function_info)) {
2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> script_name =
2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->NewStringFromUtf8(name).ToHandleChecked();
27843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    function_info = Compiler::GetSharedFunctionInfoForScript(
2785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
2786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        context, extension, NULL, ScriptCompiler::kNoCompileOptions,
2787109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        EXTENSION_CODE, false);
27886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (function_info.is_null()) return false;
2789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cache->Add(name, function_info);
2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the function context. Conceptually, we should clone the
2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function before overwriting the context but since we're in a
2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // single-threaded environment it is not strictly necessary.
2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> fun =
279644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      factory->NewFunctionFromSharedFunctionInfo(function_info, context);
2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27984515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  // Call function using either the runtime object or the global
2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object as the receiver. Provide no parameters.
2800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> receiver = isolate->global_object();
2801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !Execution::Call(isolate, fun, receiver, 0, NULL).is_null();
2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Handle<JSObject> ResolveBuiltinIdHolder(Handle<Context> native_context,
2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               const char* holder_expr) {
2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory = isolate->factory();
2809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(native_context->global_object());
2810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* period_pos = strchr(holder_expr, '.');
2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (period_pos == NULL) {
2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<JSObject>::cast(
2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Object::GetPropertyOrElement(
2814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            global, factory->InternalizeUtf8String(holder_expr))
2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            .ToHandleChecked());
2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* inner = period_pos + 1;
2818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!strchr(inner, '.'));
2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Vector<const char> property(holder_expr,
2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              static_cast<int>(period_pos - holder_expr));
2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> property_string = factory->InternalizeUtf8String(property);
2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!property_string.is_null());
2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> object = Handle<JSObject>::cast(
28243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(global, property_string).ToHandleChecked());
2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (strcmp("prototype", inner) == 0) {
2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> function = Handle<JSFunction>::cast(object);
2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<JSObject>(JSObject::cast(function->prototype()));
2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> inner_string = factory->InternalizeUtf8String(inner);
2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!inner_string.is_null());
2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> value =
28323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(object, inner_string).ToHandleChecked();
2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Handle<JSObject>::cast(value);
2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2836109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Genesis::ConfigureUtilsObject(GlobalContextType context_type) {
2837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (context_type) {
2838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // We still need the utils object to find debug functions.
2839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DEBUG_CONTEXT:
2840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
2841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Expose the natives in global if a valid name for it is specified.
2842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FULL_CONTEXT: {
2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We still need the utils object after deserialization.
2844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (isolate()->serializer_enabled()) return;
2845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (FLAG_expose_natives_as == NULL) break;
2846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (strlen(FLAG_expose_natives_as) == 0) break;
2847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      HandleScope scope(isolate());
2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<String> natives_key =
2849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          factory()->InternalizeUtf8String(FLAG_expose_natives_as);
2850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      uint32_t dummy_index;
2851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (natives_key->AsArrayIndex(&dummy_index)) break;
2852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Object> utils = isolate()->natives_utils_object();
2853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> global = isolate()->global_object();
2854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::AddProperty(global, natives_key, utils, DONT_ENUM);
2855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
2856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The utils object can be removed for cases that reach this point.
2860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_natives_utils_object(heap()->undefined_value());
2861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Bootstrapper::ExportFromRuntime(Isolate* isolate,
2865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Handle<JSObject> container) {
2866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
2867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
2868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Context> native_context = isolate->native_context();
2869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPORT_PRIVATE_SYMBOL(NAME)                                       \
2870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
2871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(container, NAME##_name, factory->NAME(), NONE);
2872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PRIVATE_SYMBOL_LIST(EXPORT_PRIVATE_SYMBOL)
2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef EXPORT_PRIVATE_SYMBOL
2874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPORT_PUBLIC_SYMBOL(NAME, DESCRIPTION)                           \
2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
2877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(container, NAME##_name, factory->NAME(), NONE);
2878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PUBLIC_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
2879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WELL_KNOWN_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
2880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef EXPORT_PUBLIC_SYMBOL
2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> to_string = InstallFunction(
2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "object_to_string", JS_OBJECT_TYPE, JSObject::kHeaderSize,
2885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MaybeHandle<JSObject>(), Builtins::kObjectProtoToString);
2886f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    to_string->shared()->set_internal_formal_parameter_count(0);
2887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    to_string->shared()->set_length(0);
2888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_object_to_string(*to_string);
2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2891f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<JSObject> iterator_prototype(
2892f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      native_context->initial_iterator_prototype());
2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2894f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  JSObject::AddProperty(container,
2895f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        factory->InternalizeUtf8String("IteratorPrototype"),
2896f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        iterator_prototype, NONE);
2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PrototypeIterator iter(native_context->sloppy_generator_function_map());
2900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> generator_function_prototype(iter.GetCurrent<JSObject>());
2901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(
2903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, factory->InternalizeUtf8String("GeneratorFunctionPrototype"),
2904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        generator_function_prototype, NONE);
2905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const bool kUseStrictFunctionMap = true;
2907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> generator_function_function = InstallFunction(
2908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "GeneratorFunction", JS_FUNCTION_TYPE, JSFunction::kSize,
2909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        generator_function_prototype, Builtins::kGeneratorFunctionConstructor,
2910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        kUseStrictFunctionMap);
2911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->set_prototype_or_initial_map(
2912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context->sloppy_generator_function_map());
2913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->shared()->DontAdaptArguments();
2914f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    generator_function_function->shared()->SetConstructStub(
2915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate->builtins()->GeneratorFunctionConstructor());
2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    generator_function_function->shared()->set_length(1);
2917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(
2918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate, generator_function_function,
2919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Context::GENERATOR_FUNCTION_FUNCTION_INDEX);
2920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2921f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::ForceSetPrototype(generator_function_function,
2922f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                isolate->function_function());
2923bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    JSObject::AddProperty(
2924bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        generator_function_prototype, factory->constructor_string(),
2925bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        generator_function_function,
2926bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2927bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->sloppy_generator_function_map()->SetConstructor(
2929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *generator_function_function);
2930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->strict_generator_function_map()->SetConstructor(
2931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *generator_function_function);
2932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  {  // -- F i x e d A r r a y I t e r a t o r
2935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    int size = JSFixedArrayIterator::kHeaderSize +
2936c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch               JSFixedArrayIterator::kInObjectPropertyCount * kPointerSize;
2937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<Map> map = factory->NewMap(JS_FIXED_ARRAY_ITERATOR_TYPE, size);
2938c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Map::SetPrototype(map, iterator_prototype);
2939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Map::EnsureDescriptorSlack(map,
2940c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               JSFixedArrayIterator::kInObjectPropertyCount);
2941c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    map->SetInObjectProperties(JSFixedArrayIterator::kInObjectPropertyCount);
2942c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    map->SetConstructor(native_context->object_function());
2943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2944c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {  // next
2945c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DataDescriptor d(factory->next_string(), JSFixedArrayIterator::kNextIndex,
2946c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                       DONT_ENUM, Representation::Tagged());
2947c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      map->AppendDescriptor(&d);
2948c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
2949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context->set_fixed_array_iterator_map(*map);
2951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
2952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- S e t I t e r a t o r
2954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> set_iterator_prototype =
2955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
2956f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::ForceSetPrototype(set_iterator_prototype, iterator_prototype);
2957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> set_iterator_function = InstallFunction(
2958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
2959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        set_iterator_prototype, Builtins::kIllegal);
2960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_set_iterator_map(set_iterator_function->initial_map());
2961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // -- M a p I t e r a t o r
2964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> map_iterator_prototype =
2965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
2966f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSObject::ForceSetPrototype(map_iterator_prototype, iterator_prototype);
2967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> map_iterator_function = InstallFunction(
2968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "MapIterator", JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize,
2969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        map_iterator_prototype, Builtins::kIllegal);
2970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_map_iterator_map(map_iterator_function->initial_map());
2971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {  // -- S c r i p t
2974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Builtin functions for Script.
2975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> script_fun = InstallFunction(
2976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        container, "Script", JS_VALUE_TYPE, JSValue::kSize,
2977f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        isolate->initial_object_prototype(), Builtins::kUnsupportedThrower);
2978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSObject> prototype =
2979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory->NewJSObject(isolate->object_function(), TENURED);
2980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(script_fun, prototype).Assert();
2981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context->set_script_function(*script_fun);
2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
2984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::EnsureDescriptorSlack(script_map, 15);
2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs =
2987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
2988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_column =
2990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptColumnOffsetInfo(isolate, attribs);
2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
2992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
2993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_column->name())), script_column,
2994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<AccessorInfo> script_id = Accessors::ScriptIdInfo(isolate, attribs);
2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(Handle<Name>(Name::cast(script_id->name())),
3001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   script_id, attribs);
3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_name =
3007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptNameInfo(isolate, attribs);
3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_name->name())), script_name, attribs);
3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_line =
3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptLineOffsetInfo(isolate, attribs);
3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_line->name())), script_line, attribs);
3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source =
3023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceInfo(isolate, attribs);
3024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_source->name())), script_source,
3027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          attribs);
3028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_type =
3032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptTypeInfo(isolate, attribs);
3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_type->name())), script_type, attribs);
3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_compilation_type =
3040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptCompilationTypeInfo(isolate, attribs);
3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_compilation_type->name())),
3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_compilation_type, attribs);
3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_context_data =
3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptContextDataInfo(isolate, attribs);
3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_context_data->name())),
3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_context_data, attribs);
3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_script =
3058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromScriptInfo(isolate, attribs);
3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_script->name())),
3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_script, attribs);
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_script_position =
3067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromScriptPositionInfo(isolate, attribs);
3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_script_position->name())),
3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_script_position, attribs);
3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_eval_from_function_name =
3076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptEvalFromFunctionNameInfo(isolate, attribs);
3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_eval_from_function_name->name())),
3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_eval_from_function_name, attribs);
3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source_url =
3085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceUrlInfo(isolate, attribs);
3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_source_url->name())),
3089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          script_source_url, attribs);
3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> script_source_mapping_url =
3094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptSourceMappingUrlInfo(isolate, attribs);
3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name>(Name::cast(script_source_mapping_url->name())),
3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          script_source_mapping_url, attribs);
3099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      script_map->AppendDescriptor(&d);
3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<AccessorInfo> script_is_embedder_debug_script =
3103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Accessors::ScriptIsEmbedderDebugScriptInfo(isolate, attribs);
3104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
3105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(
3106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Handle<Name>(Name::cast(script_is_embedder_debug_script->name())),
3107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          script_is_embedder_debug_script, attribs);
3108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      script_map->AppendDescriptor(&d);
3109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3110bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    {
3112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      PrototypeIterator iter(native_context->sloppy_async_function_map());
3113bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSObject> async_function_prototype(iter.GetCurrent<JSObject>());
3114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      static const bool kUseStrictFunctionMap = true;
3116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_constructor = InstallFunction(
3117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          container, "AsyncFunction", JS_FUNCTION_TYPE, JSFunction::kSize,
3118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_prototype, Builtins::kAsyncFunctionConstructor,
3119bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          kUseStrictFunctionMap);
3120bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->shared()->DontAdaptArguments();
3121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      async_function_constructor->shared()->SetConstructStub(
3122bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          *isolate->builtins()->AsyncFunctionConstructor());
3123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      async_function_constructor->shared()->set_length(1);
3124bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      InstallWithIntrinsicDefaultProto(isolate, async_function_constructor,
3125bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                       Context::ASYNC_FUNCTION_FUNCTION_INDEX);
3126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      JSObject::ForceSetPrototype(async_function_constructor,
3127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                  isolate->function_function());
3128bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3129bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSObject::AddProperty(
3130bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_prototype, factory->constructor_string(),
3131bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          async_function_constructor,
3132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3133bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3134bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSFunction::SetPrototype(async_function_constructor,
3135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                               async_function_prototype);
3136bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3137bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_next =
3138bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          SimpleInstallFunction(container, "AsyncFunctionNext",
313913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                Builtins::kGeneratorPrototypeNext, 1, true);
3140bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<JSFunction> async_function_throw =
3141bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          SimpleInstallFunction(container, "AsyncFunctionThrow",
314213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                Builtins::kGeneratorPrototypeThrow, 1, true);
314313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      async_function_next->shared()->set_native(false);
314413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      async_function_throw->shared()->set_native(false);
3145bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
3146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // -- C a l l S i t e
3149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Builtin functions for CallSite.
3150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // CallSites are a special case; the constructor is for our private use
3152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // only, therefore we set it up as a builtin that throws. Internally, we use
3153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // CallSiteUtils::Construct to create CallSite objects.
3154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<JSFunction> callsite_fun = InstallFunction(
3156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        container, "CallSite", JS_OBJECT_TYPE, JSObject::kHeaderSize,
3157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        isolate->initial_object_prototype(), Builtins::kUnsupportedThrower);
3158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    callsite_fun->shared()->DontAdaptArguments();
3159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    isolate->native_context()->set_callsite_function(*callsite_fun);
3160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    {
3162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSObject> proto =
3163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          factory->NewJSObject(isolate->object_function(), TENURED);
3164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      JSObject::AddProperty(proto, factory->constructor_string(), callsite_fun,
3165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                            DONT_ENUM);
3166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      struct FunctionInfo {
3168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        const char* name;
3169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Builtins::Name id;
3170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      };
3171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FunctionInfo infos[] = {
3173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber},
3174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin},
3175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getFileName", Builtins::kCallSitePrototypeGetFileName},
3176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getFunction", Builtins::kCallSitePrototypeGetFunction},
3177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getFunctionName", Builtins::kCallSitePrototypeGetFunctionName},
3178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getLineNumber", Builtins::kCallSitePrototypeGetLineNumber},
3179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getMethodName", Builtins::kCallSitePrototypeGetMethodName},
3180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getPosition", Builtins::kCallSitePrototypeGetPosition},
3181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getScriptNameOrSourceURL",
3182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           Builtins::kCallSitePrototypeGetScriptNameOrSourceURL},
3183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getThis", Builtins::kCallSitePrototypeGetThis},
3184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"getTypeName", Builtins::kCallSitePrototypeGetTypeName},
3185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"isConstructor", Builtins::kCallSitePrototypeIsConstructor},
3186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"isEval", Builtins::kCallSitePrototypeIsEval},
3187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"isNative", Builtins::kCallSitePrototypeIsNative},
3188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"isToplevel", Builtins::kCallSitePrototypeIsToplevel},
3189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          {"toString", Builtins::kCallSitePrototypeToString}};
3190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      PropertyAttributes attrs =
3192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
3193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSFunction> fun;
3195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      for (const FunctionInfo& info : infos) {
3196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        SimpleInstallFunction(proto, info.name, info.id, 0, true, attrs);
3197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      }
3198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Accessors::FunctionSetPrototype(callsite_fun, proto).Assert();
3200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
3201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
3202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Bootstrapper::ExportExperimentalFromRuntime(Isolate* isolate,
3206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 Handle<JSObject> container) {
3207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
3208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3209f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef V8_I18N_SUPPORT
3210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define INITIALIZE_FLAG(FLAG)                                         \
3211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                                   \
3212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> name =                                             \
3213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate->factory()->NewStringFromAsciiChecked(#FLAG);         \
3214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::AddProperty(container, name,                            \
3215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          isolate->factory()->ToBoolean(FLAG), NONE); \
3216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef INITIALIZE_FLAG
3219f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif
3220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(id) \
3224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Genesis::InitializeGlobal_##id() {}
3225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_do_expressions)
3227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_lookbehind)
322813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_named_captures)
3229109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexp_property)
3230109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_function_sent)
3231109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_tailcalls)
32323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_string_padding)
3233bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef V8_I18N_SUPPORT
3234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(datetime_format_to_parts)
3235bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(icu_case_mapping)
3236bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif
3237bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_async_await)
323813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_restrictive_generators)
3239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_trailing_commas)
3240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochEMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_class_fields)
3241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstallPublicSymbol(Factory* factory, Handle<Context> native_context,
3243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         const char* name, Handle<Symbol> value) {
3244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(
3245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context->global_object()));
3246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> symbol_string = factory->InternalizeUtf8String("Symbol");
3247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> symbol = Handle<JSObject>::cast(
3248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::GetProperty(global, symbol_string).ToHandleChecked());
3249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name_string = factory->InternalizeUtf8String(name);
3250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attributes =
3251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
3252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(symbol, name_string, value, attributes);
3253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
3257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_sharedarraybuffer) return;
3258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(native_context()->global_object());
3260bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Isolate* isolate = global->GetIsolate();
3261bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Factory* factory = isolate->factory();
3262bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> shared_array_buffer_fun =
3264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      InstallArrayBuffer(global, "SharedArrayBuffer",
3265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                         Builtins::kSharedArrayBufferPrototypeGetByteLength,
3266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                         BuiltinFunctionId::kSharedArrayBufferByteLength);
3267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_shared_array_buffer_fun(*shared_array_buffer_fun);
3268bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3269bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<String> name = factory->InternalizeUtf8String("Atomics");
3270bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSFunction> cons = factory->NewFunction(name);
3271bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSFunction::SetInstancePrototype(
3272bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      cons,
3273bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Handle<Object>(native_context()->initial_object_prototype(), isolate));
3274bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSObject> atomics_object = factory->NewJSObject(cons, TENURED);
3275bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(atomics_object->IsJSObject());
3276bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSObject::AddProperty(global, name, atomics_object, DONT_ENUM);
3277bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3278bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("load"),
3279bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kAtomicsLoad, 2, true);
3280bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("store"),
3281bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        Builtins::kAtomicsStore, 3, true);
3282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InitializeGlobal_harmony_simd() {
3286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_harmony_simd) return;
3287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global(
3289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalObject::cast(native_context()->global_object()));
3290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = global->GetIsolate();
3291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Factory* factory = isolate->factory();
3292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> name = factory->InternalizeUtf8String("SIMD");
3294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> cons = factory->NewFunction(name);
3295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSFunction::SetInstancePrototype(
3296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      cons,
3297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Object>(native_context()->initial_object_prototype(), isolate));
3298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  cons->shared()->set_instance_class_name(*name);
3299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> simd_object = factory->NewJSObject(cons, TENURED);
3300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(simd_object->IsJSObject());
3301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(global, name, simd_object, DONT_ENUM);
3302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Install SIMD type functions. Set the instance class names since
3304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// InstallFunction only does this when we install on the JSGlobalObject.
3305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define SIMD128_INSTALL_FUNCTION(TYPE, Type, type, lane_count, lane_type) \
3306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> type##_function = InstallFunction(                   \
3307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      simd_object, #Type, JS_VALUE_TYPE, JSValue::kSize,                  \
3308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->initial_object_prototype(), Builtins::kIllegal);           \
3309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_##type##_function(*type##_function);              \
3310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type##_function->shared()->set_instance_class_name(*factory->Type##_string());
3311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SIMD128_TYPES(SIMD128_INSTALL_FUNCTION)
3312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef SIMD128_INSTALL_FUNCTION
3313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Genesis::InitializeGlobal_harmony_array_prototype_values() {
33173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!FLAG_harmony_array_prototype_values) return;
33183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSFunction> array_constructor(native_context()->array_function());
33193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSObject> array_prototype(
33203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::cast(array_constructor->instance_prototype()));
33213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> values_iterator =
33223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::GetProperty(array_prototype, factory()->iterator_symbol())
33233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          .ToHandleChecked();
33243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(values_iterator->IsJSFunction());
33253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSObject::AddProperty(array_prototype, factory()->values_string(),
33263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        values_iterator, DONT_ENUM);
3327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> unscopables =
33293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSObject::GetProperty(array_prototype, factory()->unscopables_symbol())
33303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          .ToHandleChecked();
33313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(unscopables->IsJSObject());
33323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSObject::AddProperty(Handle<JSObject>::cast(unscopables),
33333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        factory()->values_string(), factory()->true_value(),
33343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                        NONE);
3335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::InstallArrayBuffer(Handle<JSObject> target,
3338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               const char* name,
3339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               Builtins::Name call,
3340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               BuiltinFunctionId id) {
3341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Create the %ArrayBufferPrototype%
3342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Setup the {prototype} with the given {name} for @@toStringTag.
3343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype =
3344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
3345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(prototype, factory()->to_string_tag_symbol(),
3346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        factory()->NewStringFromAsciiChecked(name),
3347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Allocate the constructor with the given {prototype}.
3350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> array_buffer_fun =
3351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallFunction(target, name, JS_ARRAY_BUFFER_TYPE,
3352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      JSArrayBuffer::kSizeWithInternalFields, prototype,
3353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      Builtins::kArrayBufferConstructor);
3354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  array_buffer_fun->shared()->SetConstructStub(
3355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      *isolate()->builtins()->ArrayBufferConstructor_ConstructStub());
3356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_buffer_fun->shared()->DontAdaptArguments();
3357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_buffer_fun->shared()->set_length(1);
3358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install the "constructor" property on the {prototype}.
3360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::AddProperty(prototype, factory()->constructor_string(),
3361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        array_buffer_fun, DONT_ENUM);
3362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SimpleInstallFunction(array_buffer_fun, factory()->isView_string(),
3364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        Builtins::kArrayBufferIsView, 1, true);
3365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Install the "byteLength" getter on the {prototype}.
3367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SimpleInstallGetter(prototype, factory()->byte_length_string(), call, false,
3368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      id);
3369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
3370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return array_buffer_fun;
3371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Genesis::InstallInternalArray(Handle<JSObject> target,
3375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 const char* name,
3376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 ElementsKind elements_kind) {
3377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // --- I n t e r n a l   A r r a y ---
3378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // An array constructor on the builtins object that works like
3379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the public Array constructor, except that its prototype
3380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // doesn't inherit from Object.prototype.
3381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // To be used only for internal work by builtins. Instances
3382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // must not be leaked to user code.
3383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> prototype =
3384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function(), TENURED);
3385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> array_function =
3386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallFunction(target, name, JS_ARRAY_TYPE, JSArray::kSize, prototype,
3387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      Builtins::kInternalArrayCode);
3388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InternalArrayConstructorStub internal_array_constructor_stub(isolate());
3390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code = internal_array_constructor_stub.GetCode();
3391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  array_function->shared()->SetConstructStub(*code);
3392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array_function->shared()->DontAdaptArguments();
3393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> original_map(array_function->initial_map());
3395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> initial_map = Map::Copy(original_map, "InternalArray");
3396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  initial_map->set_elements_kind(elements_kind);
3397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSFunction::SetInitialMap(array_function, initial_map, prototype);
3398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Make "length" magic on instances.
3400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map::EnsureDescriptorSlack(initial_map, 1);
3401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyAttributes attribs = static_cast<PropertyAttributes>(
3403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DONT_ENUM | DONT_DELETE);
3404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<AccessorInfo> array_length =
3406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Accessors::ArrayLengthInfo(isolate(), attribs);
3407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {  // Add length.
3408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AccessorConstantDescriptor d(Handle<Name>(Name::cast(array_length->name())),
3409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 array_length, attribs);
3410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->AppendDescriptor(&d);
3411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return array_function;
3414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3416109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Genesis::InstallNatives(GlobalContextType context_type) {
3417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
3418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the utils object as shared container between native scripts.
3420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function());
3421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16,
3422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                "utils container for native scripts");
3423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_natives_utils_object(*utils);
3424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the extras utils object as a shared container between native
3426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // scripts and extras. (Extras consume things added there by native scripts.)
3427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> extras_utils =
3428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function());
3429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_extras_utils_object(*extras_utils);
3430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallInternalArray(extras_utils, "InternalPackedArray", FAST_ELEMENTS);
3432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int builtin_index = Natives::GetDebuggerCount();
3434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Only run prologue.js and runtime.js at this point.
3435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(builtin_index, Natives::GetIndex("prologue"));
3436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
3437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(builtin_index, Natives::GetIndex("runtime"));
3438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
3439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
34406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  {
34416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Builtin function for OpaqueReference -- a JSValue-based object,
34426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // that keeps its field isolated from JavaScript code. It may store
34436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // objects, that JavaScript code may not access.
3444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> opaque_reference_fun = factory()->NewFunction(
3445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        factory()->empty_string(), isolate()->builtins()->Illegal(),
3446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate()->initial_object_prototype(), JS_VALUE_TYPE, JSValue::kSize);
34476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<JSObject> prototype =
3448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        factory()->NewJSObject(isolate()->object_function(), TENURED);
3449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Accessors::FunctionSetPrototype(opaque_reference_fun, prototype).Assert();
3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_opaque_reference_function(*opaque_reference_fun);
34516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
34526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // InternalArrays should not use Smi-Only array optimizations. There are too
3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // many places in the C++ runtime code (e.g. RegEx) that assume that
3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // elements in InternalArrays can be set to non-Smi values without going
3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // transition easy to trap. Moreover, they rarely are smi-only.
3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HandleScope scope(isolate());
3460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> utils =
3461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<JSObject>::cast(isolate()->natives_utils_object());
3462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    Handle<JSFunction> array_function =
3463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallInternalArray(utils, "InternalArray", FAST_HOLEY_ELEMENTS);
3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_internal_array_function(*array_function);
3465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallInternalArray(utils, "InternalPackedArray", FAST_ELEMENTS);
3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Run the rest of the native scripts.
3469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (builtin_index < Natives::GetBuiltinsCount()) {
3470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
34723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!CallUtilsFunction(isolate(), "PostNatives")) return false;
3474f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  auto fast_template_instantiations_cache = isolate()->factory()->NewFixedArray(
3475f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      TemplateInfo::kFastTemplateInstantiationsCacheSize);
3476f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  native_context()->set_fast_template_instantiations_cache(
3477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      *fast_template_instantiations_cache);
3478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3479f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  auto slow_template_instantiations_cache = UnseededNumberDictionary::New(
34803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      isolate(), ApiNatives::kInitialFunctionCacheSize);
3481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  native_context()->set_slow_template_instantiations_cache(
3482f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      *slow_template_instantiations_cache);
3483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store the map for the %ObjectPrototype% after the natives has been compiled
3485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // and the Object function has been set up.
3486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> object_function(native_context()->object_function());
3487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(JSObject::cast(object_function->initial_map()->prototype())
3488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             ->HasFastProperties());
3489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_object_function_prototype_map(
3490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      HeapObject::cast(object_function->initial_map()->prototype())->map());
3491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
349213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Set up the map for Object.create(null) instances.
3493c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Map> slow_object_with_null_prototype_map =
349413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Map::CopyInitialMap(handle(object_function->initial_map(), isolate()));
3495c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  slow_object_with_null_prototype_map->set_dictionary_map(true);
3496c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Map::SetPrototype(slow_object_with_null_prototype_map,
349713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    isolate()->factory()->null_value());
3498c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  native_context()->set_slow_object_with_null_prototype_map(
3499c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      *slow_object_with_null_prototype_map);
350013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
3501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store the map for the %StringPrototype% after the natives has been compiled
35023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // and the String function has been set up.
3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> string_function(native_context()->string_function());
3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(JSObject::cast(
3505756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      string_function->initial_map()->prototype())->HasFastProperties());
3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_string_function_prototype_map(
3507756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      HeapObject::cast(string_function->initial_map()->prototype())->map());
3508756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3509bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<JSGlobalObject> global_object =
3510bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      handle(native_context()->global_object());
3511bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
351213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Install Global.decodeURI.
351313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  SimpleInstallFunction(global_object, "decodeURI", Builtins::kGlobalDecodeURI,
3514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        1, false, kGlobalDecodeURI);
351513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
351613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Install Global.decodeURIComponent.
351713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  SimpleInstallFunction(global_object, "decodeURIComponent",
3518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        Builtins::kGlobalDecodeURIComponent, 1, false,
3519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        kGlobalDecodeURIComponent);
352013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
3521bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Install Global.encodeURI.
3522bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(global_object, "encodeURI", Builtins::kGlobalEncodeURI,
3523f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        1, false, kGlobalEncodeURI);
3524bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3525bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Install Global.encodeURIComponent.
3526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimpleInstallFunction(global_object, "encodeURIComponent",
3527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        Builtins::kGlobalEncodeURIComponent, 1, false,
3528f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        kGlobalEncodeURIComponent);
3529bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
353013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Install Global.escape.
353113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  SimpleInstallFunction(global_object, "escape", Builtins::kGlobalEscape, 1,
3532f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        false, kGlobalEscape);
353313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
353413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Install Global.unescape.
353513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  SimpleInstallFunction(global_object, "unescape", Builtins::kGlobalUnescape, 1,
3536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        false, kGlobalUnescape);
353713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
3538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install Global.eval.
3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3540bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSFunction> eval =
3541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        SimpleInstallFunction(global_object, factory()->eval_string(),
3542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                              Builtins::kGlobalEval, 1, false);
3543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    native_context()->set_global_eval_fun(*eval);
3544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3546f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Install Global.isFinite
3547f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  SimpleInstallFunction(global_object, "isFinite", Builtins::kGlobalIsFinite, 1,
3548f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        true, kGlobalIsFinite);
3549f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
3550f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Install Global.isNaN
3551f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  SimpleInstallFunction(global_object, "isNaN", Builtins::kGlobalIsNaN, 1, true,
3552f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        kGlobalIsNaN);
3553f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
3554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install Array.prototype.concat
3555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
3556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> array_constructor(native_context()->array_function());
3557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()));
3558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> concat =
3559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize,
3560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        MaybeHandle<JSObject>(), Builtins::kArrayConcat);
3561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Make sure that Array.prototype.concat appears to be compiled.
3563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // The code will never be called, but inline caching for call will
3564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // only work if it appears to be compiled.
3565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->DontAdaptArguments();
3566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(concat->is_compiled());
3567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Set the lengths for the functions to satisfy ECMA-262.
3568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->set_length(1);
3569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install InternalArray.prototype.concat
3572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
3573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> array_constructor(
3574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        native_context()->internal_array_function());
3575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()));
3576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> concat =
3577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize,
3578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        MaybeHandle<JSObject>(), Builtins::kArrayConcat);
3579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Make sure that InternalArray.prototype.concat appears to be compiled.
3581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The code will never be called, but inline caching for call will
3582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // only work if it appears to be compiled.
3583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->DontAdaptArguments();
3584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(concat->is_compiled());
3585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Set the lengths for the functions to satisfy ECMA-262.
3586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    concat->shared()->set_length(1);
3587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Set up the Promise constructor.
3590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
3591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> key = factory()->Promise_string();
3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> function = Handle<JSFunction>::cast(
3593bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        JSReceiver::GetProperty(global_object, key).ToHandleChecked());
3594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSFunction::EnsureHasInitialMap(function);
3595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function->initial_map()->set_instance_type(JS_PROMISE_TYPE);
3596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    function->shared()->SetConstructStub(
3597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *isolate()->builtins()->JSBuiltinsConstructStub());
3598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallWithIntrinsicDefaultProto(isolate(), function,
3599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Context::PROMISE_FUNCTION_INDEX);
3600c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
3601c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    {
3602c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Handle<Code> code = handle(
3603c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate()->builtins()->builtin(Builtins::kPromiseResolveClosure),
3604c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate());
3605c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Handle<SharedFunctionInfo> info =
3606c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate()->factory()->NewSharedFunctionInfo(factory()->empty_string(),
3607c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                      code, false);
3608c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      info->set_internal_formal_parameter_count(1);
3609c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      info->set_length(1);
3610c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      native_context()->set_promise_resolve_shared_fun(*info);
3611c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
3612c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      code = handle(
3613c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate()->builtins()->builtin(Builtins::kPromiseRejectClosure),
3614c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate());
3615c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      info = isolate()->factory()->NewSharedFunctionInfo(
3616c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          factory()->empty_string(), code, false);
3617c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      info->set_internal_formal_parameter_count(2);
3618c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      info->set_length(1);
3619c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      native_context()->set_promise_reject_shared_fun(*info);
3620c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
3621c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
3622c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<JSFunction> create_resolving_functions =
3623c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        SimpleCreateFunction(isolate(), factory()->empty_string(),
3624c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                             Builtins::kCreateResolvingFunctions, 2, false);
3625c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    native_context()->set_create_resolving_functions(
3626c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        *create_resolving_functions);
3627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
362942effa50d92d47f80404ee63808dbde9921e6202Ben Murdoch  InstallBuiltinFunctionIds();
363042effa50d92d47f80404ee63808dbde9921e6202Ben Murdoch
3631109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Create a map for accessor property descriptors (a variant of JSObject
3632109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // that predefines four properties get, set, configurable and enumerable).
3633109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  {
3634109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // AccessorPropertyDescriptor initial map.
3635109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<Map> map =
3636109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory()->NewMap(JS_OBJECT_TYPE, JSAccessorPropertyDescriptor::kSize);
3637109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the descriptor array for the property descriptor object.
3638109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::EnsureDescriptorSlack(map, 4);
3639109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3640109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // get
3641109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->get_string(),
3642109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kGetIndex, NONE,
3643109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3644109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3645109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3646109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // set
3647109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->set_string(),
3648109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kSetIndex, NONE,
3649109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3650109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3651109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3652109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // enumerable
3653109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->enumerable_string(),
3654109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kEnumerableIndex, NONE,
3655109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3656109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3657109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3658109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // configurable
3659109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->configurable_string(),
3660109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSAccessorPropertyDescriptor::kConfigurableIndex, NONE,
3661109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3662109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3663109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3664109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3665109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::SetPrototype(map, isolate()->initial_object_prototype());
3666109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
3667109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetInObjectProperties(4);
3668109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_unused_property_fields(0);
3669109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3670109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    native_context()->set_accessor_property_descriptor_map(*map);
3671109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
3672109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3673109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Create a map for data property descriptors (a variant of JSObject
3674109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // that predefines four properties value, writable, configurable and
3675109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // enumerable).
3676109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  {
3677109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // DataPropertyDescriptor initial map.
3678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<Map> map =
3679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        factory()->NewMap(JS_OBJECT_TYPE, JSDataPropertyDescriptor::kSize);
3680109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // Create the descriptor array for the property descriptor object.
3681109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::EnsureDescriptorSlack(map, 4);
3682109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3683109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // value
3684109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->value_string(),
3685109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kValueIndex, NONE,
3686109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3687109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3688109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3689109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // writable
3690109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->writable_string(),
3691109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kWritableIndex, NONE,
3692109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3693109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3694109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3695109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // enumerable
3696109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->enumerable_string(),
3697109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kEnumerableIndex, NONE,
3698109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3699109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3700109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3701109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    {  // configurable
3702109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      DataDescriptor d(factory()->configurable_string(),
3703109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       JSDataPropertyDescriptor::kConfigurableIndex, NONE,
3704109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                       Representation::Tagged());
3705109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      map->AppendDescriptor(&d);
3706109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
3707109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3708109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Map::SetPrototype(map, isolate()->initial_object_prototype());
3709109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetConstructor(native_context()->object_function());
3710109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->SetInObjectProperties(4);
3711109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    map->set_unused_property_fields(0);
3712109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3713109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    native_context()->set_data_property_descriptor_map(*map);
3714109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
3715109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
37166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Create a constructor for RegExp results (a variant of Array that
37176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // predefines the two properties index and match).
37186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  {
37196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // RegExpResult initial map.
37206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Find global.Array.prototype to inherit from.
3722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> array_constructor(native_context()->array_function());
37236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<JSObject> array_prototype(
37246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        JSObject::cast(array_constructor->instance_prototype()));
37256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Add initial map.
37276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<Map> initial_map =
3728257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize);
3729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetConstructor(*array_constructor);
37306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Set prototype on map.
37326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_non_instance_prototype(false);
3733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map::SetPrototype(initial_map, array_prototype);
37346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    // Update map with length accessor from Array and add "index" and "input".
3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map::EnsureDescriptorSlack(initial_map, 3);
3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSFunction* array_function = native_context()->array_function();
3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<DescriptorArray> array_descriptors(
3741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          array_function->initial_map()->instance_descriptors());
3742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<String> length = factory()->length_string();
3743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int old = array_descriptors->SearchWithCache(
3744109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          isolate(), *length, array_function->initial_map());
3745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(old != DescriptorArray::kNotFound);
3746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor desc(
3747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          length, handle(array_descriptors->GetValue(old), isolate()),
3748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          array_descriptors->GetDetails(old).attributes());
3749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&desc);
3750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
37516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    {
3752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor index_field(factory()->index_string(),
3753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 JSRegExpResult::kIndexIndex, NONE,
3754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Representation::Tagged());
3755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&index_field);
37566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
37576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    {
3759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DataDescriptor input_field(factory()->input_string(),
3760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 JSRegExpResult::kInputIndex, NONE,
3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Representation::Tagged());
3762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      initial_map->AppendDescriptor(&input_field);
37636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
37646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map->SetInObjectProperties(2);
37666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    initial_map->set_unused_property_fields(0);
37676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context()->set_regexp_result_map(*initial_map);
37696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
37706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Add @@iterator method to the arguments object maps.
3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyAttributes attribs = DONT_ENUM;
3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AccessorInfo> arguments_iterator =
3775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Accessors::ArgumentsIteratorInfo(isolate(), attribs);
3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Map> map(native_context()->sloppy_arguments_map());
3780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Map> map(native_context()->fast_aliased_arguments_map());
3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
3791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Map> map(native_context()->slow_aliased_arguments_map());
3794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Map::EnsureDescriptorSlack(map, 1);
3795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map->AppendDescriptor(&d);
3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
3798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AccessorConstantDescriptor d(factory()->iterator_symbol(),
3799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   arguments_iterator, attribs);
3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Map> map(native_context()->strict_arguments_map());
3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map::EnsureDescriptorSlack(map, 1);
3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map->AppendDescriptor(&d);
3803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
3807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbool Genesis::InstallExperimentalNatives() {
3811109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_tailcalls_natives[] = {nullptr};
3812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_sharedarraybuffer_natives[] = {
3813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "native harmony-atomics.js", NULL};
3814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_simd_natives[] = {"native harmony-simd.js",
3815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               nullptr};
3816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_do_expressions_natives[] = {nullptr};
3817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* harmony_regexp_lookbehind_natives[] = {nullptr};
381813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static const char* harmony_regexp_named_captures_natives[] = {nullptr};
3819109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_regexp_property_natives[] = {nullptr};
3820109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const char* harmony_function_sent_natives[] = {nullptr};
38213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_array_prototype_values_natives[] = {nullptr};
38223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const char* harmony_string_padding_natives[] = {
38233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      "native harmony-string-padding.js", nullptr};
3824bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef V8_I18N_SUPPORT
3825bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* icu_case_mapping_natives[] = {"native icu-case-mapping.js",
3826bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                   nullptr};
3827f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const char* datetime_format_to_parts_natives[] = {
3828f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      "native datetime-format-to-parts.js", nullptr};
3829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif
3830f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const char* harmony_async_await_natives[] = {nullptr};
383113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static const char* harmony_restrictive_generators_natives[] = {nullptr};
3832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* harmony_trailing_commas_natives[] = {nullptr};
3833f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const char* harmony_class_fields_natives[] = {nullptr};
3834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3835257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (int i = ExperimentalNatives::GetDebuggerCount();
3836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       i < ExperimentalNatives::GetBuiltinsCount(); i++) {
3837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define INSTALL_EXPERIMENTAL_NATIVES(id, desc)                                \
3838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_##id) {                                                            \
3839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (size_t j = 0; id##_natives[j] != NULL; j++) {                        \
3840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \
3841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (strncmp(script_name.start(), id##_natives[j],                       \
3842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                  script_name.length()) == 0) {                               \
3843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (!Bootstrapper::CompileExperimentalBuiltin(isolate(), i)) {        \
3844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          return false;                                                       \
3845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }                                                                     \
3846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }                                                                       \
3847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }                                                                         \
3848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
3849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES);
3850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES);
3851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES);
3852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef INSTALL_EXPERIMENTAL_NATIVES
3853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3854257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false;
3856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstallExperimentalBuiltinFunctionIds();
3858257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return true;
3859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallExtraNatives() {
3863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
3864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> extras_binding =
3866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      factory()->NewJSObject(isolate()->object_function());
3867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_extras_binding_object(*extras_binding);
3868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = ExtraNatives::GetDebuggerCount();
3870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       i < ExtraNatives::GetBuiltinsCount(); i++) {
3871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false;
3872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
3875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallExperimentalExtraNatives() {
3879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = ExperimentalExtraNatives::GetDebuggerCount();
3880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       i < ExperimentalExtraNatives::GetBuiltinsCount(); i++) {
3881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileExperimentalExtraBuiltin(isolate(), i))
3882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return false;
3883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
3886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Genesis::InstallDebuggerNatives() {
3890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < Natives::GetDebuggerCount(); ++i) {
3891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
3892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CallUtilsFunction(isolate(), "PostDebug");
3894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic void InstallBuiltinFunctionId(Handle<JSObject> holder,
3898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     const char* function_name,
3899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     BuiltinFunctionId id) {
3900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = holder->GetIsolate();
3901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> function_object =
39023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      JSReceiver::GetProperty(isolate, holder, function_name).ToHandleChecked();
3903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
39043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  function->shared()->set_builtin_function_id(id);
390525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}
390625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
390725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
3908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \
3909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  { #holder_expr, #fun_name, k##name }                  \
3910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ,
391125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
391225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
3913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallBuiltinFunctionIds() {
3914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
3915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct BuiltinFunctionIds {
3916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const char* holder_expr;
3917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const char* fun_name;
3918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BuiltinFunctionId id;
3919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
39206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const BuiltinFunctionIds builtins[] = {
3922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)};
39236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (const BuiltinFunctionIds& builtin : builtins) {
3925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSObject> holder =
3926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ResolveBuiltinIdHolder(native_context(), builtin.holder_expr);
3927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id);
3928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
39296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
39306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
39316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Genesis::InstallExperimentalBuiltinFunctionIds() {
3933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_harmony_sharedarraybuffer) {
3934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    struct BuiltinFunctionIds {
3935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      const char* holder_expr;
3936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      const char* fun_name;
3937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      BuiltinFunctionId id;
3938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
39396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const BuiltinFunctionIds atomic_builtins[] = {
3941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        ATOMIC_FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)};
39420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
3943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (const BuiltinFunctionIds& builtin : atomic_builtins) {
3944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> holder =
3945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ResolveBuiltinIdHolder(native_context(), builtin.holder_expr);
3946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id);
3947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
39500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
39516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef INSTALL_BUILTIN_ID
39536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
39546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
395580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Genesis::InitializeNormalizedMapCaches() {
3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate());
3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_normalized_map_cache(*cache);
395880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
395980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
396080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Bootstrapper::InstallExtensions(Handle<Context> native_context,
39623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                     v8::ExtensionConfiguration* extensions) {
3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BootstrapperActive active(this);
3964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SaveContext saved_context(isolate_);
3965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate_->set_context(*native_context);
3966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Genesis::InstallExtensions(native_context, extensions) &&
3967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Genesis::InstallSpecialObjects(native_context);
39683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
39693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
39703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallSpecialObjects(Handle<Context> native_context) {
3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
3973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Don't install extensions into the snapshot.
3974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (isolate->serializer_enabled()) return true;
3975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Factory* factory = isolate->factory();
3977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
3978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSGlobalObject> global(JSGlobalObject::cast(
3979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      native_context->global_object()));
3980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> Error = isolate->error_function();
3982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name =
3983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit"));
3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::AddProperty(Error, name, stack_trace_limit, NONE);
3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Expose the debug global object in global if a name for it is specified.
3988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
3989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // If loading fails we just bail out without installing the
3990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // debugger but without tanking the whole context.
3991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Debug* debug = isolate->debug();
3992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!debug->Load()) return true;
3993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Context> debug_context = debug->debug_context();
3994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Set the security token for the debugger context to the same as
3995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // the shell native context to allow calling between these (otherwise
3996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // exposing debug global object doesn't make much sense).
3997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    debug_context->set_security_token(native_context->security_token());
3998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<String> debug_string =
3999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        factory->InternalizeUtf8String(FLAG_expose_debug_as);
4000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t index;
4001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (debug_string->AsArrayIndex(&index)) return true;
4002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> global_proxy(debug_context->global_proxy(), isolate);
4003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSObject::AddProperty(global, debug_string, global_proxy, DONT_ENUM);
4004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4006f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  WasmJs::Install(isolate, global);
4007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
4009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochstatic uint32_t Hash(RegisteredExtension* extension) {
40133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return v8::internal::ComputePointerHash(extension);
40143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochGenesis::ExtensionStates::ExtensionStates() : map_(8) {}
40173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochGenesis::ExtensionTraversalState Genesis::ExtensionStates::get_state(
40193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    RegisteredExtension* extension) {
402013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  base::HashMap::Entry* entry = map_.Lookup(extension, Hash(extension));
40213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (entry == NULL) {
40223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return UNVISITED;
40233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
40243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return static_cast<ExtensionTraversalState>(
40253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<intptr_t>(entry->value));
40263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Genesis::ExtensionStates::set_state(RegisteredExtension* extension,
40293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         ExtensionTraversalState state) {
4030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  map_.LookupOrInsert(extension, Hash(extension))->value =
40313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<void*>(static_cast<intptr_t>(state));
40323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtensions(Handle<Context> native_context,
4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                v8::ExtensionConfiguration* extensions) {
4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = native_context->GetIsolate();
40383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ExtensionStates extension_states;  // All extensions have state UNVISITED.
4039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InstallAutoExtensions(isolate, &extension_states) &&
4040bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_free_buffer ||
4041bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/free-buffer", &extension_states)) &&
4042bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_gc ||
4043bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/gc", &extension_states)) &&
4044bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_externalize_string ||
4045bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/externalize", &extension_states)) &&
4046c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         (!FLAG_gc_stats ||
4047bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/statistics", &extension_states)) &&
4048bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         (!FLAG_expose_trigger_failure ||
4049bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
4050c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         (!FLAG_trace_ignition_dispatches ||
4051bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          InstallExtension(isolate, "v8/ignition-statistics",
4052bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                           &extension_states)) &&
4053bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         InstallRequestedExtensions(isolate, extensions, &extension_states);
4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallAutoExtensions(Isolate* isolate,
4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ExtensionStates* extension_states) {
4059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
4060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it != NULL;
4061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it = it->next()) {
4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (it->extension()->auto_enable() &&
4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        !InstallExtension(isolate, it, extension_states)) {
4064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallRequestedExtensions(Isolate* isolate,
4072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         v8::ExtensionConfiguration* extensions,
4073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         ExtensionStates* extension_states) {
4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (const char** it = extensions->begin(); it != extensions->end(); ++it) {
4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!InstallExtension(isolate, *it, extension_states)) return false;
4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
4078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Installs a named extension.  This methods is unoptimized and does
4082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// not scale well if we want to support a large number of extensions.
4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtension(Isolate* isolate,
4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               const char* name,
40853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states) {
4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it != NULL;
4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       it = it->next()) {
4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (strcmp(name, it->extension()->name()) == 0) {
4090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return InstallExtension(isolate, it, extension_states);
4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Utils::ApiCheck(false,
4094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         "v8::Context::New()",
4095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         "Cannot find required extension");
4096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Genesis::InstallExtension(Isolate* isolate,
4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               v8::RegisteredExtension* current,
41013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ExtensionStates* extension_states) {
4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
4103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (extension_states->get_state(current) == INSTALLED) return true;
4105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The current node has already been visited so there must be a
4106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // cycle in the dependency graph; fail.
4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!Utils::ApiCheck(extension_states->get_state(current) != VISITED,
4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       "v8::Context::New()",
4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       "Circular extension dependency")) {
4110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
4111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(extension_states->get_state(current) == UNVISITED);
41133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  extension_states->set_state(current, VISITED);
4114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v8::Extension* extension = current->extension();
4115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Install the extension's dependencies
4116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < extension->dependency_count(); i++) {
4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!InstallExtension(isolate,
4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          extension->dependencies()[i],
4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          extension_states)) {
41203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We do not expect this to throw an exception. Change this if it does.
4124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool result = CompileExtension(isolate, extension);
4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(isolate->has_pending_exception() != result);
4126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!result) {
41273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We print out the name of the extension that fail to install.
41283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // When an error is thrown during bootstrapping we automatically print
41293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the line number at which this happened to the console in the isolate
41303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // error throwing functionality.
4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    base::OS::PrintError("Error installing extension '%s'.\n",
4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         current->extension()->name());
413344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->clear_pending_exception();
4134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
41353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  extension_states->set_state(current, INSTALLED);
41363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  isolate->NotifyExtensionInstalled();
4137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
4138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Genesis::ConfigureGlobalObjects(
4142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Local<v8::ObjectTemplate> global_proxy_template) {
4143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSObject> global_proxy(
4144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSObject::cast(native_context()->global_proxy()));
4145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> global_object(
4146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSObject::cast(native_context()->global_object()));
4147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!global_proxy_template.IsEmpty()) {
4149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Configure the global proxy object.
4150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<ObjectTemplateInfo> global_proxy_data =
4151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        v8::Utils::OpenHandle(*global_proxy_template);
4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ConfigureApiObject(global_proxy, global_proxy_data)) return false;
4153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Configure the global object.
4155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<FunctionTemplateInfo> proxy_constructor(
4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FunctionTemplateInfo::cast(global_proxy_data->constructor()));
415713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!proxy_constructor->prototype_template()->IsUndefined(isolate())) {
4158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<ObjectTemplateInfo> global_object_data(
4159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          ObjectTemplateInfo::cast(proxy_constructor->prototype_template()));
4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!ConfigureApiObject(global_object, global_object_data)) return false;
4161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
4162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(global_proxy, global_object);
4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_initial_array_prototype(
4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSArray::cast(native_context()->array_function()->prototype()));
4168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_array_buffer_map(
4169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->array_buffer_fun()->initial_map());
4170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_js_map_map(
4171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->js_map_fun()->initial_map());
4172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  native_context()->set_js_set_map(
4173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      native_context()->js_set_fun()->initial_map());
4174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
4176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Genesis::ConfigureApiObject(Handle<JSObject> object,
4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<ObjectTemplateInfo> object_template) {
4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!object_template.is_null());
4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(FunctionTemplateInfo::cast(object_template->constructor())
4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             ->IsTemplateFor(object->map()));;
4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaybeHandle<JSObject> maybe_obj =
4186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ApiNatives::InstantiateObject(object_template);
4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> obj;
4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!maybe_obj.ToHandle(&obj)) {
4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate()->has_pending_exception());
4190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    isolate()->clear_pending_exception();
4191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
4192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferObject(obj, object);
4194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
4195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferNamedProperties(Handle<JSObject> from,
4199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Handle<JSObject> to) {
4200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If JSObject::AddProperty asserts due to already existing property,
4201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // it is likely due to both global objects sharing property name(s).
4202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Merging those two global objects is impossible.
4203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The global template must not create properties that already exist
4204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in the snapshotted global object.
4205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (from->HasFastProperties()) {
4206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<DescriptorArray> descs =
4207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Handle<DescriptorArray>(from->map()->instance_descriptors());
4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) {
4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PropertyDetails details = descs->GetDetails(i);
4210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      switch (details.type()) {
4211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case DATA: {
4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key = Handle<Name>(descs->GetKey(i));
4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FieldIndex index = FieldIndex::ForDescriptor(from->map(), i);
4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DCHECK(!descs->GetDetails(i).representation().IsDouble());
4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index),
4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                isolate());
4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          JSObject::AddProperty(to, key, value, details.attributes());
4219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
4220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
4221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case DATA_CONSTANT: {
4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key = Handle<Name>(descs->GetKey(i));
4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> constant(descs->GetConstant(i), isolate());
4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          JSObject::AddProperty(to, key, constant, details.attributes());
4226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
4227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
4228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case ACCESSOR:
4229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UNREACHABLE();
4230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case ACCESSOR_CONSTANT: {
4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Name> key(descs->GetKey(i));
4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
4234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          // If the property is already there we skip it
4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (it.IsFound()) continue;
4236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HandleScope inner(isolate());
4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DCHECK(!to->HasFastProperties());
42383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          // Add to dictionary.
4239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate());
4240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          PropertyDetails d(details.attributes(), ACCESSOR_CONSTANT, i + 1,
4241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            PropertyCellType::kMutable);
42423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          JSObject::SetNormalizedProperty(to, key, callbacks, d);
4243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
4244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
4245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
4246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
4247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (from->IsJSGlobalObject()) {
4248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<GlobalDictionary> properties =
4249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<GlobalDictionary>(from->global_dictionary());
4250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int capacity = properties->Capacity();
4251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < capacity; i++) {
4252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Object* raw_key(properties->KeyAt(i));
425313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      if (properties->IsKey(isolate(), raw_key)) {
4254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(raw_key->IsName());
4255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // If the property is already there we skip it.
4256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Name> key(Name::cast(raw_key));
4257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
4258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
4259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (it.IsFound()) continue;
4260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // Set the property.
4261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(properties->ValueAt(i)->IsPropertyCell());
4262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<PropertyCell> cell(PropertyCell::cast(properties->ValueAt(i)));
4263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<Object> value(cell->value(), isolate());
426413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        if (value->IsTheHole(isolate())) continue;
4265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        PropertyDetails details = cell->property_details();
4266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK_EQ(kData, details.kind());
4267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        JSObject::AddProperty(to, key, value, details.attributes());
4268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
4269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
4271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<NameDictionary> properties =
4272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<NameDictionary>(from->property_dictionary());
4273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int capacity = properties->Capacity();
4274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < capacity; i++) {
4275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Object* raw_key(properties->KeyAt(i));
427613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      if (properties->IsKey(isolate(), raw_key)) {
4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(raw_key->IsName());
4278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // If the property is already there we skip it.
4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Name> key(Name::cast(raw_key));
4280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (it.IsFound()) continue;
4283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Set the property.
4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Object> value = Handle<Object>(properties->ValueAt(i),
4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              isolate());
4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(!value->IsCell());
428713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        DCHECK(!value->IsTheHole(isolate()));
4288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        PropertyDetails details = properties->DetailsAt(i);
4289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK_EQ(kData, details.kind());
4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSObject::AddProperty(to, key, value, details.attributes());
4291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
4292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
4293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferIndexedProperties(Handle<JSObject> from,
4298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<JSObject> to) {
4299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Cloning the elements array is sufficient.
4300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> from_elements =
4301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Handle<FixedArray>(FixedArray::cast(from->elements()));
4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> to_elements = factory()->CopyFixedArray(from_elements);
4303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  to->set_elements(*to_elements);
4304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
4308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope outer(isolate());
4309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!from->IsJSArray());
4311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!to->IsJSArray());
4312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferNamedProperties(from, to);
4314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TransferIndexedProperties(from, to);
4315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Transfer the prototype (new map is needed).
4317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> proto(from->map()->prototype(), isolate());
4318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(to, proto);
4319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Genesis::MakeFunctionInstancePrototypeWritable() {
432344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The maps with writable prototype are created in CreateEmptyFunction
432444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and CreateStrictModeFunctionMaps respectively. Initially the maps are
432544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // created with read-only prototype for JS builtins processing.
4326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!sloppy_function_map_writable_prototype_.is_null());
4327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!strict_function_map_writable_prototype_.is_null());
432844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
432944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Replace function instance maps to make prototype writable.
4330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_sloppy_function_map(
4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *sloppy_function_map_writable_prototype_);
4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  native_context()->set_strict_function_map(
4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *strict_function_map_writable_prototype_);
4334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass NoTrackDoubleFieldsForSerializerScope {
4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit NoTrackDoubleFieldsForSerializerScope(Isolate* isolate)
4340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : flag_(FLAG_track_double_fields), enabled_(false) {
4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (isolate->serializer_enabled()) {
4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Disable tracking double fields because heap numbers treated as
4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // immutable by the serializer.
4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FLAG_track_double_fields = false;
4345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      enabled_ = true;
4346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~NoTrackDoubleFieldsForSerializerScope() {
4350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (enabled_) {
4351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FLAG_track_double_fields = flag_;
4352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool flag_;
4357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool enabled_;
4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochGenesis::Genesis(Isolate* isolate,
4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
4362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 v8::Local<v8::ObjectTemplate> global_proxy_template,
4363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 v8::ExtensionConfiguration* extensions,
436413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                 size_t context_snapshot_index, GlobalContextType context_type)
4365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : isolate_(isolate), active_(isolate->bootstrapper()) {
4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
4367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result_ = Handle<Context>::null();
4368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_ = Handle<JSGlobalProxy>::null();
4369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Before creating the roots we must save the context and restore it
4371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // on all function exits.
437244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext saved_context(isolate);
43733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
43743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // During genesis, the boilerplate for stack overflow won't work until the
43753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // environment has been at least partially initialized. Add a stack check
43763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // before entering JS code to catch overflow early.
4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StackLimitCheck check(isolate);
4378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (check.HasOverflowed()) {
4379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    isolate->StackOverflow();
4380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
4381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
4382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The deserializer needs to hook up references to the global proxy.
4384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create an uninitialized global proxy now if we don't have one
4385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // and initialize it later in CreateNewGlobals.
4386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalProxy> global_proxy;
4387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!maybe_global_proxy.ToHandle(&global_proxy)) {
4388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    const int internal_field_count =
4389c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        !global_proxy_template.IsEmpty()
4390c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            ? global_proxy_template->InternalFieldCount()
4391c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            : 0;
4392c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    global_proxy = isolate->factory()->NewUninitializedJSGlobalProxy(
4393c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        JSGlobalProxy::SizeWithInternalFields(internal_field_count));
4394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
43953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We can only de-serialize a context if the isolate was initialized from
4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a snapshot. Otherwise we have to build the context from scratch.
4398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Also create a context from scratch to expose natives, if required by flag.
4399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!isolate->initialized_from_snapshot() ||
440013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      !Snapshot::NewContextFromSnapshot(isolate, global_proxy,
440113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                        context_snapshot_index)
4402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           .ToHandle(&native_context_)) {
4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    native_context_ = Handle<Context>();
4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!native_context().is_null()) {
4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddToWeakNativeContextList(*native_context());
4408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    isolate->set_context(*native_context());
440944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->counters()->contexts_created_by_snapshot()->Increment();
4410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
4411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (FLAG_trace_maps) {
4412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Handle<JSFunction> object_fun = isolate->object_function();
4413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PrintF("[TraceMap: InitialMap map= %p SFI= %d_Object ]\n",
4414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier             reinterpret_cast<void*>(object_fun->initial_map()),
4415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier             object_fun->shared()->unique_id());
4416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Map::TraceAllTransitions(object_fun->initial_map());
4417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
4418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
4419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalObject> global_object =
4420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CreateNewGlobals(global_proxy_template, global_proxy);
4421402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalProxy(global_object, global_proxy);
4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalObject(global_object);
4424402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ConfigureGlobalObjects(global_proxy_template)) return;
44263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
44273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // We get here if there was no context snapshot.
44283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    CreateRoots();
4429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
443044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    CreateStrictModeFunctionMaps(empty_function);
4431bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CreateIteratorMaps(empty_function);
4432bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CreateAsyncFunctionMaps(empty_function);
4433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSGlobalObject> global_object =
4434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CreateNewGlobals(global_proxy_template, global_proxy);
4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HookUpGlobalProxy(global_object, global_proxy);
4436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InitializeGlobal(global_object, empty_function, context_type);
443780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    InitializeNormalizedMapCaches();
4438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!InstallNatives(context_type)) return;
44403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
44413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    MakeFunctionInstancePrototypeWritable();
44423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
444313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!InstallExtraNatives()) return;
444413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!ConfigureGlobalObjects(global_proxy_template)) return;
444513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
444644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    isolate->counters()->contexts_created_from_scratch()->Increment();
4447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Re-initialize the counter because it got incremented during snapshot
4448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // creation.
4449c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    isolate->native_context()->set_errors_thrown(Smi::kZero);
44503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
4451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Install experimental natives. Do not include them into the
4453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // snapshot as we should be able to turn them off at runtime. Re-installing
4454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // them after they have already been deserialized would also fail.
4455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (context_type == FULL_CONTEXT) {
4456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!isolate->serializer_enabled()) {
4457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      InitializeExperimentalGlobal();
4458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!InstallExperimentalNatives()) return;
4459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (FLAG_experimental_extras) {
4461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (!InstallExperimentalExtraNatives()) return;
4462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
4463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The serializer cannot serialize typed arrays. Reset those typed arrays
4465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // for each new context.
4466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (context_type == DEBUG_CONTEXT) {
4467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!isolate->serializer_enabled());
4468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InitializeExperimentalGlobal();
4469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!InstallDebuggerNatives()) return;
4470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
4471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ConfigureUtilsObject(context_type);
4473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check that the script context table is empty except for the 'this' binding.
4475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We do not need script contexts for native scripts.
4476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_EQ(1, native_context()->script_context_table()->used());
4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result_ = native_context();
4479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochGenesis::Genesis(Isolate* isolate,
4482f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
4483f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                 v8::Local<v8::ObjectTemplate> global_proxy_template)
4484f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    : isolate_(isolate), active_(isolate->bootstrapper()) {
4485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
4486f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  result_ = Handle<Context>::null();
4487f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_ = Handle<JSGlobalProxy>::null();
4488f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4489f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Before creating the roots we must save the context and restore it
4490f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // on all function exits.
4491f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SaveContext saved_context(isolate);
4492f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4493f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // During genesis, the boilerplate for stack overflow won't work until the
4494f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // environment has been at least partially initialized. Add a stack check
4495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // before entering JS code to catch overflow early.
4496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StackLimitCheck check(isolate);
4497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (check.HasOverflowed()) {
4498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    isolate->StackOverflow();
4499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return;
4500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
4501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const int proxy_size = JSGlobalProxy::SizeWithInternalFields(
4503c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      global_proxy_template->InternalFieldCount());
4504c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
4505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSGlobalProxy> global_proxy;
4506f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (!maybe_global_proxy.ToHandle(&global_proxy)) {
4507c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    global_proxy = factory()->NewUninitializedJSGlobalProxy(proxy_size);
4508f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
4509f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // CreateNewGlobals.
4511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<ObjectTemplateInfo> global_proxy_data =
4512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      v8::Utils::OpenHandle(*global_proxy_template);
4513f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<FunctionTemplateInfo> global_constructor(
4514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FunctionTemplateInfo::cast(global_proxy_data->constructor()));
4515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<SharedFunctionInfo> shared =
4516f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      FunctionTemplateInfo::GetOrCreateSharedFunctionInfo(isolate,
4517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                          global_constructor);
4518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> initial_map =
4519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      factory()->CreateSloppyFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE);
4520f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSFunction> global_proxy_function =
4521f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      isolate->factory()->NewFunctionFromSharedFunctionInfo(
4522f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          initial_map, shared, factory()->undefined_value());
4523c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(global_proxy_data->internal_field_count(),
4524c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            global_proxy_template->InternalFieldCount());
4525f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> global_proxy_map = isolate->factory()->NewMap(
4526c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      JS_GLOBAL_PROXY_TYPE, proxy_size, FAST_HOLEY_SMI_ELEMENTS);
4527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSFunction::SetInitialMap(global_proxy_function, global_proxy_map,
4528f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                            factory()->null_value());
4529f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_map->set_is_access_check_needed(true);
4530f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_map->set_is_callable();
4531f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_map->set_is_constructor(true);
4532f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_map->set_has_hidden_prototype(true);
4533f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4534f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<String> global_name = factory()->global_string();
4535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_function->shared()->set_instance_class_name(*global_name);
4536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
4537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4538f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // HookUpGlobalProxy.
4539c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  global_proxy->set_native_context(heap()->null_value());
4540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4541f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // DetachGlobal.
4542f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  JSObject::ForceSetPrototype(global_proxy, factory()->null_value());
4543f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4544f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  global_proxy_ = global_proxy;
4545f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Support for thread preemption.
4548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Reserve space for statics needing saving and restoring.
4550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Bootstrapper::ArchiveSpacePerThread() {
455144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return sizeof(NestingCounterType);
4552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Archive statics that are thread-local.
4556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* Bootstrapper::ArchiveState(char* to) {
455744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  *reinterpret_cast<NestingCounterType*>(to) = nesting_;
455844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  nesting_ = 0;
455944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return to + sizeof(NestingCounterType);
4560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Restore statics that are thread-local.
4564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* Bootstrapper::RestoreState(char* from) {
456544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  nesting_ = *reinterpret_cast<NestingCounterType*>(from);
456644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return from + sizeof(NestingCounterType);
4567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Called when the top-level V8 mutex is destroyed.
4571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Bootstrapper::FreeThreadResources() {
4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!IsActive());
4573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
4576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
4577