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