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