12f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 22f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 32f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h" 6196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/accessors.h" 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate-inl.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/natives.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/snapshot.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/trig-table.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/extensions/externalize-string-extension.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/extensions/free-buffer-extension.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/extensions/gc-extension.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/extensions/statistics-extension.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/extensions/trigger-failure-extension.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/code-stubs.h" 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 2071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgNativesExternalStringResource::NativesExternalStringResource( 23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Bootstrapper* bootstrapper, 24e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org const char* source, 25e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org size_t length) 26e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org : data_(source), length_(length) { 27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (bootstrapper->delete_these_non_arrays_on_tear_down_ == NULL) { 28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper->delete_these_non_arrays_on_tear_down_ = new List<char*>(2); 29c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 30c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // The resources are small objects and we only make a fixed number of 31c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // them, but let's clean them up on exit for neatness. 32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper->delete_these_non_arrays_on_tear_down_-> 33c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org Add(reinterpret_cast<char*>(this)); 34c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgBootstrapper::Bootstrapper(Isolate* isolate) 38c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org : isolate_(isolate), 39c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org nesting_(0), 40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org extensions_cache_(Script::TYPE_EXTENSION), 41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_non_arrays_on_tear_down_(NULL), 42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_arrays_on_tear_down_(NULL) { 43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<String> Bootstrapper::NativesSourceLookup(int index) { 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(0 <= index && index < Natives::GetBuiltinsCount()); 48c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Heap* heap = isolate_->heap(); 497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org if (heap->natives_source_cache()->get(index)->IsUndefined()) { 50fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // We can use external strings for the natives. 51fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Vector<const char> source = Natives::GetRawScriptSource(index); 52fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org NativesExternalStringResource* resource = 53fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org new NativesExternalStringResource(this, 54fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org source.start(), 55fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org source.length()); 56b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to throw an exception. Change this if it does. 57255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org Handle<String> source_code = 58255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org isolate_->factory()->NewExternalStringFromAscii( 59255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org resource).ToHandleChecked(); 60fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org heap->natives_source_cache()->set(index, *source_code); 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 6209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> cached_source(heap->natives_source_cache()->get(index), 6309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate_); 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Handle<String>::cast(cached_source); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Bootstrapper::Initialize(bool create_heap_objects) { 69e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org extensions_cache_.Initialize(isolate_, create_heap_objects); 70bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org} 71bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 72bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org 7343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgstatic const char* GCFunctionName() { 7443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org bool flag_given = FLAG_expose_gc_as != NULL && strlen(FLAG_expose_gc_as) != 0; 7543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org return flag_given ? FLAG_expose_gc_as : "gc"; 7643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org} 7743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 7843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 7943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgv8::Extension* Bootstrapper::free_buffer_extension_ = NULL; 8043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgv8::Extension* Bootstrapper::gc_extension_ = NULL; 8143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgv8::Extension* Bootstrapper::externalize_string_extension_ = NULL; 8243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgv8::Extension* Bootstrapper::statistics_extension_ = NULL; 8343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgv8::Extension* Bootstrapper::trigger_failure_extension_ = NULL; 8443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 8543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 86bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgvoid Bootstrapper::InitializeOncePerProcess() { 8743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org free_buffer_extension_ = new FreeBufferExtension; 8843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org v8::RegisterExtension(free_buffer_extension_); 8943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org gc_extension_ = new GCExtension(GCFunctionName()); 9043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org v8::RegisterExtension(gc_extension_); 9143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org externalize_string_extension_ = new ExternalizeStringExtension; 9243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org v8::RegisterExtension(externalize_string_extension_); 9343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org statistics_extension_ = new StatisticsExtension; 9443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org v8::RegisterExtension(statistics_extension_); 9543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org trigger_failure_extension_ = new TriggerFailureExtension; 9643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org v8::RegisterExtension(trigger_failure_extension_); 9743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org} 9843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 9943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 10043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgvoid Bootstrapper::TearDownExtensions() { 10143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org delete free_buffer_extension_; 10243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org delete gc_extension_; 10343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org delete externalize_string_extension_; 10443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org delete statistics_extension_; 10543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org delete trigger_failure_extension_; 10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgchar* Bootstrapper::AllocateAutoDeletedArray(int bytes) { 11013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org char* memory = new char[bytes]; 11113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org if (memory != NULL) { 112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (delete_these_arrays_on_tear_down_ == NULL) { 113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_arrays_on_tear_down_ = new List<char*>(2); 11413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 115ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_arrays_on_tear_down_->Add(memory); 11613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 11713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org return memory; 11813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 11913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 12013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Bootstrapper::TearDown() { 122ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (delete_these_non_arrays_on_tear_down_ != NULL) { 123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int len = delete_these_non_arrays_on_tear_down_->length(); 1245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org ASSERT(len < 24); // Don't use this mechanism for unbounded allocations. 125c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org for (int i = 0; i < len; i++) { 126ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete delete_these_non_arrays_on_tear_down_->at(i); 127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_non_arrays_on_tear_down_->at(i) = NULL; 128c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete delete_these_non_arrays_on_tear_down_; 130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_non_arrays_on_tear_down_ = NULL; 131c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 132c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (delete_these_arrays_on_tear_down_ != NULL) { 134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int len = delete_these_arrays_on_tear_down_->length(); 13513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org ASSERT(len < 1000); // Don't use this mechanism for unbounded allocations. 13613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org for (int i = 0; i < len; i++) { 137ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete[] delete_these_arrays_on_tear_down_->at(i); 138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_arrays_on_tear_down_->at(i) = NULL; 13913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 140ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete delete_these_arrays_on_tear_down_; 141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete_these_arrays_on_tear_down_ = NULL; 14213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 14313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 144e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Genesis BASE_EMBEDDED { 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Genesis(Isolate* isolate, 151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Object> global_object, 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Handle<v8::ObjectTemplate> global_template, 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::ExtensionConfiguration* extensions); 1545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ~Genesis() { } 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 156160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Isolate* isolate() const { return isolate_; } 157160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Factory* factory() const { return isolate_->factory(); } 158160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Heap* heap() const { return isolate_->heap(); } 159160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1607bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org Handle<Context> result() { return result_; } 1618718d7369b327b17a9881a04a366ede344f60d0djkummerow@chromium.org 1627bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org private: 16346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<Context> native_context() { return native_context_; } 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Creates some basic objects. Used for creating a context from scratch. 1665d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org void CreateRoots(); 1675d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Creates the empty function. Used for creating a context from scratch. 168160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); 169ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 17054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> GetStrictPoisonFunction(); 17154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // Poison for sloppy generator function arguments/callee. 17254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> GetGeneratorPoisonFunction(); 173ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); 175f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 176f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // Make the "arguments" and "caller" properties throw a TypeError on access. 177f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org void PoisonArgumentsAndCaller(Handle<Map> map); 178f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 1795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Creates the global objects using the global and the template passed in 1805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // through the API. We call this regardless of whether we are building a 1815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // context from scratch or using a deserialized one from the partial snapshot 1825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // but in the latter case we don't use the objects it produces directly, as 1835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // we have to used the deserialized ones that are linked together with the 1845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // rest of the context snapshot. 1855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSGlobalProxy> CreateNewGlobals( 1865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Handle<v8::ObjectTemplate> global_template, 1875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Object> global_object, 1885d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject>* global_proxy_out); 1895d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Hooks the given global proxy into the context. If the context was created 1905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // by deserialization then this will unhook the global proxy that was 1915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // deserialized, leaving the GC to pick it up. 1925d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org void HookUpGlobalProxy(Handle<GlobalObject> inner_global, 1935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSGlobalProxy> global_proxy); 1945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Similarly, we want to use the inner global that has been created by the 1955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // templates passed through the API. The inner global from the snapshot is 1965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // detached from the other objects in the snapshot. 1975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org void HookUpInnerGlobal(Handle<GlobalObject> inner_global); 1985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // New context initialization. Used for creating a context from scratch. 199ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org void InitializeGlobal(Handle<GlobalObject> inner_global, 2005d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSFunction> empty_function); 2017c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org void InitializeExperimentalGlobal(); 2025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Installs the contents of the native .js files on the global objects. 2035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Used for creating a context from scratch. 20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void InstallNativeFunctions(); 205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void InstallExperimentalBuiltinFunctionIds(); 206ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org void InstallExperimentalNativeFunctions(); 207c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<JSFunction> InstallInternalArray(Handle<JSBuiltinsObject> builtins, 208c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org const char* name, 209c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org ElementsKind elements_kind); 21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool InstallNatives(); 211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 212a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org void InstallTypedArray( 213a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org const char* name, 214a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ElementsKind elements_kind, 215a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<JSFunction>* fun, 216a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Map>* external_map); 217160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org bool InstallExperimentalNatives(); 2185f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org void InstallBuiltinFunctionIds(); 219c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org void InstallJSFunctionResultCaches(); 22065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org void InitializeNormalizedMapCaches(); 22127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 22227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org enum ExtensionTraversalState { 22327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org UNVISITED, VISITED, INSTALLED 22427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org }; 22527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 22627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org class ExtensionStates { 227ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org public: 22827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates(); 22927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionTraversalState get_state(RegisteredExtension* extension); 23027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void set_state(RegisteredExtension* extension, 23127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionTraversalState state); 232ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org private: 23327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org HashMap map_; 23427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org DISALLOW_COPY_AND_ASSIGN(ExtensionStates); 23527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org }; 23627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 2375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Used both for deserialized and from-scratch contexts to add the extensions 2385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // provided. 23946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org static bool InstallExtensions(Handle<Context> native_context, 2405d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::ExtensionConfiguration* extensions); 2415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static bool InstallAutoExtensions(Isolate* isolate, 2425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ExtensionStates* extension_states); 2435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static bool InstallRequestedExtensions(Isolate* isolate, 2445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org v8::ExtensionConfiguration* extensions, 2455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ExtensionStates* extension_states); 246c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org static bool InstallExtension(Isolate* isolate, 247c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org const char* name, 24827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates* extension_states); 249c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org static bool InstallExtension(Isolate* isolate, 250c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org v8::RegisteredExtension* current, 25127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates* extension_states); 2525c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org static bool InstallSpecialObjects(Handle<Context> native_context); 2535c838251403b0be9a882540f1922577abba4c872ager@chromium.org bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); 2545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org bool ConfigureApiObject(Handle<JSObject> object, 2555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<ObjectTemplateInfo> object_template); 2565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template); 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Migrates all properties from the 'from' object to the 'to' 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // object and overrides the prototype in 'to' with the one from 26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 'from'. 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void TransferObject(Handle<JSObject> from, Handle<JSObject> to); 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); 26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org enum FunctionMode { 26670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org // With prototype. 26770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FUNCTION_WITH_WRITEABLE_PROTOTYPE, 26870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FUNCTION_WITH_READONLY_PROTOTYPE, 26970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org // Without prototype. 27070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FUNCTION_WITHOUT_PROTOTYPE, 27170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org BOUND_FUNCTION 2724111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org }; 273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 27470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org static bool IsFunctionModeWithPrototype(FunctionMode function_mode) { 27570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || 27670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org function_mode == FUNCTION_WITH_READONLY_PROTOTYPE); 27770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org } 27870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org 27970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> CreateFunctionMap(FunctionMode function_mode); 280ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 281304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org void SetFunctionInstanceDescriptor(Handle<Map> map, 28270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FunctionMode function_mode); 28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void MakeFunctionInstancePrototypeWritable(); 28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 285486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> CreateStrictFunctionMap( 28670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FunctionMode function_mode, 287f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Handle<JSFunction> empty_function); 288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 289304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org void SetStrictFunctionInstanceDescriptor(Handle<Map> map, 29070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FunctionMode function_mode); 291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 292160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org static bool CompileBuiltin(Isolate* isolate, int index); 293160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org static bool CompileExperimentalBuiltin(Isolate* isolate, int index); 294c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org static bool CompileNative(Isolate* isolate, 295c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Vector<const char> name, 296c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<String> source); 297c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org static bool CompileScriptCached(Isolate* isolate, 298c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Vector<const char> name, 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<String> source, 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SourceCodeCache* cache, 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Extension* extension, 3025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Context> top_context, 30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool use_runtime_context); 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3057bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org Isolate* isolate_; 30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Context> result_; 3077bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org Handle<Context> native_context_; 308ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 309906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Function maps. Function maps are created initially with a read only 310906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // prototype for the processing of JS builtins. Later the function maps are 311906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // replaced in order to make prototype writable. These are the final, writable 312906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // prototype, maps. 313486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> sloppy_function_map_writable_prototype_; 314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> strict_function_map_writable_prototype_; 31554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> strict_poison_function; 31654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> generator_poison_function; 317ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 3185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org BootstrapperActive active_; 3195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org friend class Bootstrapper; 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Bootstrapper::Iterate(ObjectVisitor* v) { 324ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org extensions_cache_.Iterate(v); 32564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kExtensions); 32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Context> Bootstrapper::CreateEnvironment( 33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> global_object, 33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Handle<v8::ObjectTemplate> global_template, 33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::ExtensionConfiguration* extensions) { 333c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate_); 334c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Genesis genesis(isolate_, global_object, global_template, extensions); 335e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<Context> env = genesis.result(); 336e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (env.is_null() || !InstallExtensions(env, extensions)) { 337e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return Handle<Context>(); 3385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 339e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return scope.CloseAndEscape(env); 34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgstatic void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { 3445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // object.__proto__ = proto; 3455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<Map> old_to_map = Handle<Map>(object->map()); 346ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Handle<Map> new_to_map = Map::Copy(old_to_map); 3475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_to_map->set_prototype(*proto); 3485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org object->set_map(*new_to_map); 3495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 3505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 3515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 3525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid Bootstrapper::DetachGlobal(Handle<Context> env) { 353160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Factory* factory = env->GetIsolate()->factory(); 354355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); 355355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org global_proxy->set_native_context(*factory->null_value()); 356355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org SetObjectPrototype(global_proxy, factory->null_value()); 357df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org} 358df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org 359df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org 36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic Handle<JSFunction> InstallFunction(Handle<JSObject> target, 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* name, 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstanceType type, 36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int instance_size, 3643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org MaybeHandle<JSObject> maybe_prototype, 3653c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::Name call) { 366160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Isolate* isolate = target->GetIsolate(); 3677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Factory* factory = isolate->factory(); 3684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> internalized_name = factory->InternalizeUtf8String(name); 3697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); 3703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSObject> prototype; 3713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> function = maybe_prototype.ToHandle(&prototype) 3723c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org ? factory->NewFunction(internalized_name, call_code, prototype, 3733c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org type, instance_size) 3743c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org : factory->NewFunctionWithoutPrototype(internalized_name, call_code); 3751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org PropertyAttributes attributes; 3761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (target->IsJSBuiltinsObject()) { 3771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org attributes = 3781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 3791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } else { 3801805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org attributes = DONT_ENUM; 3811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } 382fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 3838f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org target, internalized_name, function, attributes).Check(); 3843c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org if (target->IsJSGlobalObject()) { 3854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org function->shared()->set_instance_class_name(*internalized_name); 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 387394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com function->shared()->set_native(true); 38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return function; 38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 392304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid Genesis::SetFunctionInstanceDescriptor( 39370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> map, FunctionMode function_mode) { 39470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; 3952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(map, size); 396304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 397dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org PropertyAttributes attribs = static_cast<PropertyAttributes>( 398dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org DONT_ENUM | DONT_DELETE | READ_ONLY); 399394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 400f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<AccessorInfo> length = 401dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionLengthInfo(isolate(), attribs); 402ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // Add length. 403f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), 404dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org length, attribs); 4052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 407a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org Handle<AccessorInfo> name = 408dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionNameInfo(isolate(), attribs); 409ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // Add name. 410a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), 411dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org name, attribs); 4122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 414f05311f128ad22c89cfb6063d9375945c02239b5machenbach@chromium.org Handle<AccessorInfo> args = 415dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionArgumentsInfo(isolate(), attribs); 416ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // Add arguments. 417f05311f128ad22c89cfb6063d9375945c02239b5machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(args->name())), 418dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org args, attribs); 4192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 420ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 4213484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<AccessorInfo> caller = 422dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionCallerInfo(isolate(), attribs); 423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // Add caller. 4243484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(caller->name())), 425dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org caller, attribs); 4262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 42870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (IsFunctionModeWithPrototype(function_mode)) { 42970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) { 430dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); 431ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 432f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<AccessorInfo> prototype = 433dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionPrototypeInfo(isolate(), attribs); 434f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), 435dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org prototype, attribs); 4362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 4374111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org } 438ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgHandle<Map> Genesis::CreateFunctionMap(FunctionMode function_mode) { 442160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 44370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SetFunctionInstanceDescriptor(map, function_mode); 44470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return map; 44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 449160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgHandle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { 450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allocate the map for function instances. Maps are allocated first and their 451ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // prototypes patched later, once empty function is created. 452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4534111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // Functions with this map will not have a 'prototype' property, and 4544111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // can not be used as constructors. 455c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org Handle<Map> function_without_prototype_map = 45670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); 457486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_sloppy_function_without_prototype_map( 458c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org *function_without_prototype_map); 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 460ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allocate the function map. This map is temporary, used only for processing 461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // of builtins. 462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Later the map is replaced with writable prototype map, allocated below. 46370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> function_map = 46470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE); 465486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_sloppy_function_map(*function_map); 4663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org native_context()->set_sloppy_function_with_readonly_prototype_map( 4673c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org *function_map); 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 469ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The final map for functions. Writeable prototype. 470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // This map is installed in MakeFunctionInstancePrototypeWritable. 471486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org sloppy_function_map_writable_prototype_ = 47270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE); 473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Factory* factory = isolate->factory(); 4757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 476906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Handle<String> object_name = factory->Object_string(); 47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- O b j e c t --- 4793c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> object_fun = factory->NewFunction(object_name); 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Map> object_function_map = 4817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_fun->set_initial_map(*object_function_map); 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_function_map->set_constructor(*object_fun); 484011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org object_function_map->set_unused_property_fields( 485011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org JSObject::kInitialGlobalObjectUnusedPropertiesCount); 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_object_function(*object_fun); 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a new prototype for the object function. 490e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<JSObject> prototype = factory->NewJSObject( 491e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org isolate->object_function(), 49271fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org TENURED); 493e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 49446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_initial_object_prototype(*prototype); 495906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // For bootstrapping set the array prototype to be the same as the object 496906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // prototype, otherwise the missing initial_array_prototype will cause 497906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // assertions during startup. 498906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org native_context()->set_initial_array_prototype(*prototype); 499ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org Accessors::FunctionSetPrototype(object_fun, prototype); 50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the empty function as the prototype for function ECMAScript 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 262 15.3.4. 5044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> empty_string = 5054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); 5068496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); 5073c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> empty_function = factory->NewFunctionWithoutPrototype( 5083c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org empty_string, code); 50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // --- E m p t y --- 5118496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<String> source = factory->NewStringFromStaticAscii("() {}"); 5127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<Script> script = factory->NewScript(source); 5135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 5145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org empty_function->shared()->set_script(*script); 5155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org empty_function->shared()->set_start_position(0); 5165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org empty_function->shared()->set_end_position(source->length()); 5175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org empty_function->shared()->DontAdaptArguments(); 518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Set prototypes for the function maps. 520486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->sloppy_function_map()->set_prototype(*empty_function); 521486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->sloppy_function_without_prototype_map()-> 5224111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org set_prototype(*empty_function); 523486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org sloppy_function_map_writable_prototype_->set_prototype(*empty_function); 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Allocate the function map first and then patch the prototype later 52670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> empty_function_map = 52770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); 5285f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org empty_function_map->set_prototype( 52946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->object_function()->prototype()); 5305f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org empty_function->set_map(*empty_function_map); 5315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return empty_function; 5325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 535304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid Genesis::SetStrictFunctionInstanceDescriptor( 53670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> map, FunctionMode function_mode) { 53770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; 5382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(map, size); 539304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 540304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Handle<AccessorPair> arguments(factory()->NewAccessorPair()); 541304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Handle<AccessorPair> caller(factory()->NewAccessorPair()); 542b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PropertyAttributes rw_attribs = 543b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 544b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PropertyAttributes ro_attribs = 545b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 54770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org // Add length. 54870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (function_mode == BOUND_FUNCTION) { 54970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<String> length_string = isolate()->factory()->length_string(); 55070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FieldDescriptor d(length_string, 0, ro_attribs, Representation::Tagged()); 55170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org map->AppendDescriptor(&d); 55270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org } else { 55370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ASSERT(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || 55470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || 55570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org function_mode == FUNCTION_WITHOUT_PROTOTYPE); 55670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<AccessorInfo> length = 55770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Accessors::FunctionLengthInfo(isolate(), ro_attribs); 558f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), 559f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org length, ro_attribs); 5602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 562a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org Handle<AccessorInfo> name = 563dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org Accessors::FunctionNameInfo(isolate(), ro_attribs); 564f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org { // Add name. 565a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), 566dad7b7ffa46155ecfcec62acd8ef524641fbe882machenbach@chromium.org name, ro_attribs); 5672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 569f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org { // Add arguments. 5705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CallbacksDescriptor d(factory()->arguments_string(), arguments, 571b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org rw_attribs); 5722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 574f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org { // Add caller. 5755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CallbacksDescriptor d(factory()->caller_string(), caller, rw_attribs); 5762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 57870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (IsFunctionModeWithPrototype(function_mode)) { 579f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // Add prototype. 580b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PropertyAttributes attribs = 58170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs 58270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org : ro_attribs; 583f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<AccessorInfo> prototype = 584f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Accessors::FunctionPrototypeInfo(isolate(), attribs); 585f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), 586f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org prototype, attribs); 5872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 588ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// ECMAScript 5th Edition, 13.2.3 59354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.orgHandle<JSFunction> Genesis::GetStrictPoisonFunction() { 59454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org if (strict_poison_function.is_null()) { 5954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> name = factory()->InternalizeOneByteString( 596a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org STATIC_ASCII_VECTOR("ThrowTypeError")); 59740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org Handle<Code> code(isolate()->builtins()->builtin( 59840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org Builtins::kStrictModePoisonPill)); 59954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org strict_poison_function = factory()->NewFunctionWithoutPrototype(name, code); 60054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org strict_poison_function->set_map(native_context()->sloppy_function_map()); 60154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org strict_poison_function->shared()->DontAdaptArguments(); 60254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 60354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org JSObject::PreventExtensions(strict_poison_function).Assert(); 60454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org } 60554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org return strict_poison_function; 60654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org} 60754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 60854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 60954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.orgHandle<JSFunction> Genesis::GetGeneratorPoisonFunction() { 61054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org if (generator_poison_function.is_null()) { 61154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<String> name = factory()->InternalizeOneByteString( 61254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org STATIC_ASCII_VECTOR("ThrowTypeError")); 61354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<Code> code(isolate()->builtins()->builtin( 61454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Builtins::kGeneratorPoisonPill)); 61554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org generator_poison_function = factory()->NewFunctionWithoutPrototype( 6163c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org name, code); 61754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org generator_poison_function->set_map(native_context()->sloppy_function_map()); 61854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org generator_poison_function->shared()->DontAdaptArguments(); 61940cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 62054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org JSObject::PreventExtensions(generator_poison_function).Assert(); 62140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org } 62254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org return generator_poison_function; 623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 626486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgHandle<Map> Genesis::CreateStrictFunctionMap( 62770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org FunctionMode function_mode, 628f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Handle<JSFunction> empty_function) { 629160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 63070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SetStrictFunctionInstanceDescriptor(map, function_mode); 63170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map->set_prototype(*empty_function); 633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return map; 634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 636ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { 638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allocate map for the prototype-less strict mode instances. 639486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> strict_function_without_prototype_map = 64070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty); 641486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_strict_function_without_prototype_map( 642486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org *strict_function_without_prototype_map); 643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allocate map for the strict mode functions. This map is temporary, used 645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // only for processing of builtins. 646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Later the map is replaced with writable prototype map, allocated below. 647486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> strict_function_map = 64870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); 649486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_strict_function_map(*strict_function_map); 650ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The final map for the strict mode functions. Writeable prototype. 652ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // This map is installed in MakeFunctionInstancePrototypeWritable. 653486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org strict_function_map_writable_prototype_ = 65470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); 65570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org // Special map for bound functions. 65670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org Handle<Map> bound_function_map = 65770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org CreateStrictFunctionMap(BOUND_FUNCTION, empty); 65870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org native_context()->set_bound_function_map(*bound_function_map); 659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 660f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Complete the callbacks. 661486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org PoisonArgumentsAndCaller(strict_function_without_prototype_map); 662486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org PoisonArgumentsAndCaller(strict_function_map); 663486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org PoisonArgumentsAndCaller(strict_function_map_writable_prototype_); 66470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org PoisonArgumentsAndCaller(bound_function_map); 665f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org} 666f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 667f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 668f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgstatic void SetAccessors(Handle<Map> map, 669f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Handle<String> name, 670f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Handle<JSFunction> func) { 671f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org DescriptorArray* descs = map->instance_descriptors(); 67206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org int number = descs->SearchWithCache(*name, *map); 673f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org AccessorPair* accessors = AccessorPair::cast(descs->GetValue(number)); 674f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org accessors->set_getter(*func); 675f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org accessors->set_setter(*func); 676f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org} 677f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 678f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 67954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.orgstatic void ReplaceAccessors(Handle<Map> map, 68054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<String> name, 68154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org PropertyAttributes attributes, 68254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<AccessorPair> accessor_pair) { 68354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org DescriptorArray* descriptors = map->instance_descriptors(); 68454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org int idx = descriptors->SearchWithCache(*name, *map); 68554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org CallbacksDescriptor descriptor(name, accessor_pair, attributes); 68654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org descriptors->Replace(idx, &descriptor); 68754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org} 68854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 68954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 690f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvoid Genesis::PoisonArgumentsAndCaller(Handle<Map> map) { 69154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org SetAccessors(map, factory()->arguments_string(), GetStrictPoisonFunction()); 69254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org SetAccessors(map, factory()->caller_string(), GetStrictPoisonFunction()); 693ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 694ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 695ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 69646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgstatic void AddToWeakNativeContextList(Context* context) { 69746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(context->IsNativeContext()); 698160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Heap* heap = context->GetIsolate()->heap(); 699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG 700a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { // NOLINT 701a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); 702a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Check that context is not in the list yet. 70346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org for (Object* current = heap->native_contexts_list(); 704a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org !current->IsUndefined(); 705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { 706a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(current != context); 707a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 708a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 709a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 71046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list()); 71146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org heap->set_native_contexts_list(context); 712a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid Genesis::CreateRoots() { 71646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Allocate the native context FixedArray first and then patch the 7175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // closure and extension object later (we need the empty function 7185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // and the global object, but in order to create those, we need the 71946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // native context). 7207bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org native_context_ = factory()->NewNativeContext(); 7217bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org AddToWeakNativeContextList(*native_context()); 72246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org isolate()->set_context(*native_context()); 72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Allocate the message listeners object. 7255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org { 7264610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org v8::NeanderArray listeners(isolate()); 72746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_message_listeners(*listeners.value()); 7285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 7295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 7305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 7315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 7325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgHandle<JSGlobalProxy> Genesis::CreateNewGlobals( 7335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Handle<v8::ObjectTemplate> global_template, 7345d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Object> global_object, 7355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject>* inner_global_out) { 7365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // The argument global_template aka data is an ObjectTemplateInfo. 7375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // It has a constructor pointer that points at global_constructor which is a 7385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // FunctionTemplateInfo. 7395d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // The global_constructor is used to create or reinitialize the global_proxy. 7405d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // The global_constructor also has a prototype_template pointer that points at 7415d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // js_global_template which is an ObjectTemplateInfo. 7425d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // That in turn has a constructor pointer that points at 7435d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // js_global_constructor which is a FunctionTemplateInfo. 7445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // js_global_constructor is used to make js_global_function 7455d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // js_global_function is used to make the new inner_global. 7465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // 7475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // --- G l o b a l --- 7485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Step 1: Create a fresh inner JSGlobalObject. 7495d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSFunction> js_global_function; 7505d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<ObjectTemplateInfo> js_global_template; 7515d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!global_template.IsEmpty()) { 7525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Get prototype template of the global_template. 7535d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<ObjectTemplateInfo> data = 7545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Utils::OpenHandle(*global_template); 7555d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<FunctionTemplateInfo> global_constructor = 7565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<FunctionTemplateInfo>( 7575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org FunctionTemplateInfo::cast(data->constructor())); 75809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> proto_template(global_constructor->prototype_template(), 75909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate()); 7605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!proto_template->IsUndefined()) { 7615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org js_global_template = 7625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<ObjectTemplateInfo>::cast(proto_template); 7635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 7645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7665d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (js_global_template.is_null()) { 7674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> name = Handle<String>(heap()->empty_string()); 768160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( 7697979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kIllegal)); 7703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org js_global_function = factory()->NewFunction( 7713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org name, code, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize); 7725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Change the constructor property of the prototype of the 7735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // hidden global function to refer to the Object function. 7745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSObject> prototype = 7755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSObject>( 7765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org JSObject::cast(js_global_function->instance_prototype())); 777fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 7788f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org prototype, factory()->constructor_string(), 7798f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate()->object_function(), NONE).Check(); 7805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 7815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<FunctionTemplateInfo> js_global_constructor( 7825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org FunctionTemplateInfo::cast(js_global_template->constructor())); 7835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org js_global_function = 784160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->CreateApiFunction(js_global_constructor, 785a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org factory()->the_hole_value(), 786160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->InnerGlobalObject); 7875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7895d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org js_global_function->initial_map()->set_is_hidden_prototype(); 79088767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com js_global_function->initial_map()->set_dictionary_map(true); 7915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject> inner_global = 792160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewGlobalObject(js_global_function); 7935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (inner_global_out != NULL) { 7945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org *inner_global_out = inner_global; 79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Step 2: create or re-initialize the global proxy object. 7985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSFunction> global_proxy_function; 7995d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (global_template.IsEmpty()) { 8004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> name = Handle<String>(heap()->empty_string()); 801160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( 8027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kIllegal)); 8033c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org global_proxy_function = factory()->NewFunction( 8043c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org name, code, JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize); 8055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 8065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<ObjectTemplateInfo> data = 8075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Utils::OpenHandle(*global_template); 8085d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<FunctionTemplateInfo> global_constructor( 8095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org FunctionTemplateInfo::cast(data->constructor())); 8105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org global_proxy_function = 811160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->CreateApiFunction(global_constructor, 812a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org factory()->the_hole_value(), 813160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->OuterGlobalObject); 8145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 8155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> global_name = factory()->InternalizeOneByteString( 817a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org STATIC_ASCII_VECTOR("global")); 8185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org global_proxy_function->shared()->set_instance_class_name(*global_name); 8195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org global_proxy_function->initial_map()->set_is_access_check_needed(true); 8205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects 8225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Return the global proxy. 8235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 82429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org Handle<JSGlobalProxy> global_proxy; 8255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (global_object.location() != NULL) { 8265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(global_object->IsJSGlobalProxy()); 82729699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org global_proxy = Handle<JSGlobalProxy>::cast(global_object); 828e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function); 8295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 83029699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org global_proxy = Handle<JSGlobalProxy>::cast( 831160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewJSObject(global_proxy_function, TENURED)); 83229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org global_proxy->set_hash(heap()->undefined_value()); 8335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 83429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org return global_proxy; 8355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 8365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid Genesis::HookUpGlobalProxy(Handle<GlobalObject> inner_global, 8395d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSGlobalProxy> global_proxy) { 84046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Set the native context for the global object. 84146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org inner_global->set_native_context(*native_context()); 842355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org inner_global->set_global_context(*native_context()); 8435d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org inner_global->set_global_receiver(*global_proxy); 84446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org global_proxy->set_native_context(*native_context()); 84546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_global_proxy(*global_proxy); 8465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 8475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8495d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgvoid Genesis::HookUpInnerGlobal(Handle<GlobalObject> inner_global) { 8505d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject> inner_global_from_snapshot( 8517bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org GlobalObject::cast(native_context()->extension())); 8527bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org Handle<JSBuiltinsObject> builtins_global(native_context()->builtins()); 8537bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org native_context()->set_extension(*inner_global); 8547bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org native_context()->set_global_object(*inner_global); 8557bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org native_context()->set_security_token(*inner_global); 8565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static const PropertyAttributes attributes = 8575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); 8588f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty(builtins_global, 8598f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 8608f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("global")), 8618f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org inner_global, 8628f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org attributes).Assert(); 863f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up the reference from the global object to the builtins object. 8645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org JSGlobalObject::cast(*inner_global)->set_builtins(*builtins_global); 8655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org TransferNamedProperties(inner_global_from_snapshot, inner_global); 8665d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org TransferIndexedProperties(inner_global_from_snapshot, inner_global); 8675d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 8685d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org// This is only called if we are not using snapshots. The equivalent 8715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org// work in the snapshot case is done in HookUpInnerGlobal. 872ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, 8735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSFunction> empty_function) { 874a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // --- N a t i v e C o n t e x t --- 8755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Use the empty function as closure (no scope info). 87646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_closure(*empty_function); 87746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_previous(NULL); 8785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Set extension and global object. 87946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_extension(*inner_global); 88046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_global_object(*inner_global); 8815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Security setup: Set the security token of the global object to 8825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // its the inner global. This makes the security check between two 8835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // different contexts fail by default even in case of global 8845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // object reinitialization. 88546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_security_token(*inner_global); 8865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 887160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Isolate* isolate = inner_global->GetIsolate(); 8887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Factory* factory = isolate->factory(); 8897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Heap* heap = isolate->heap(); 8907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 891906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Handle<String> object_name = factory->Object_string(); 892fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 8938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org inner_global, object_name, 8948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate->object_function(), DONT_ENUM).Check(); 8955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 8963c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSObject> global(native_context()->global_object()); 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Install global Function object 89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, 9003c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org empty_function, Builtins::kIllegal); 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- A r r a y --- 90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> array_function = 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, 9057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 9063c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kArrayCode); 907b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org array_function->shared()->DontAdaptArguments(); 9081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); 90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // This seems a bit hackish, but we need to make sure Array.length 91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // is 1. 91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen array_function->shared()->set_length(1); 913304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 914de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org Handle<Map> initial_map(array_function->initial_map()); 9151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // This assert protects an optimization in 9171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // HGraphBuilder::JSArrayBuilder::EmitMapCode() 9181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ASSERT(initial_map->elements_kind() == GetInitialFastElementsKind()); 9192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(initial_map, 1); 920304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 921304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org PropertyAttributes attribs = static_cast<PropertyAttributes>( 922304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org DONT_ENUM | DONT_DELETE); 923304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 9243484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<AccessorInfo> array_length = 9253484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Accessors::ArrayLengthInfo(isolate, attribs); 926304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { // Add length. 9273484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org CallbacksDescriptor d( 9283484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<Name>(Name::cast(array_length->name())), 9293484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org array_length, attribs); 9302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org array_function->initial_map()->AppendDescriptor(&d); 931304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // array_function is used internally. JS code creating array object should 93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // search for the 'Array' property on the global object and use that one 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // as the constructor. 'Array' property on a global object can be 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // overwritten by JS code. 93746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_array_function(*array_function); 938ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 9391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Cache the array maps, needed by ArrayConstructorStub 9401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CacheInitialJSArrayMaps(native_context(), initial_map); 9411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStub array_constructor_stub(isolate); 942f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Code> code = array_constructor_stub.GetCode(); 9431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_function->shared()->set_construct_stub(*code); 94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- N u m b e r --- 94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> number_fun = 94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, 9497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 9503c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 95146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_number_function(*number_fun); 95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- B o o l e a n --- 95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> boolean_fun = 95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, 9577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 9583c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 95946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_boolean_function(*boolean_fun); 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- S t r i n g --- 96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> string_fun = 96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, 9657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 9663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 967d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org string_fun->shared()->set_construct_stub( 9687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->builtins()->builtin(Builtins::kStringConstructCode)); 96946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_string_function(*string_fun); 97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Map> string_map = 97246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<Map>(native_context()->string_function()->initial_map()); 9732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(string_map, 1); 974304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 975304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org PropertyAttributes attribs = static_cast<PropertyAttributes>( 976304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org DONT_ENUM | DONT_DELETE | READ_ONLY); 977731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org Handle<AccessorInfo> string_length( 978731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org Accessors::StringLengthInfo(isolate, attribs)); 979304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 980304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { // Add length. 9815b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CallbacksDescriptor d(factory->length_string(), string_length, attribs); 9822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org string_map->AppendDescriptor(&d); 983304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- D a t e --- 98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Builtin functions for Date.prototype. 98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> date_fun = 9894efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, 9907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 9913c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 99346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_date_function(*date_fun); 99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // -- R e g E x p 99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Builtin functions for RegExp.prototype. 99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> regexp_fun = 1000236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, 10017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->initial_object_prototype(), 10023c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 100346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_regexp_function(*regexp_fun); 100425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 100525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org ASSERT(regexp_fun->has_initial_map()); 100625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org Handle<Map> initial_map(regexp_fun->initial_map()); 100725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 100825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org ASSERT_EQ(0, initial_map->inobject_properties()); 100925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 101025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org PropertyAttributes final = 101125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 10122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(initial_map, 5); 1013304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 101425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org { 101525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // ECMA-262, section 15.10.7.1. 10165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor field(factory->source_string(), 101725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org JSRegExp::kSourceFieldIndex, 1018f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org final, 1019f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 10202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&field); 102125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org } 102225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org { 102325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // ECMA-262, section 15.10.7.2. 10245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor field(factory->global_string(), 102525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org JSRegExp::kGlobalFieldIndex, 1026f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org final, 1027f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 10282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&field); 102925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org } 103025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org { 103125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // ECMA-262, section 15.10.7.3. 10325b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor field(factory->ignore_case_string(), 103325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org JSRegExp::kIgnoreCaseFieldIndex, 1034f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org final, 1035f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 10362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&field); 103725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org } 103825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org { 103925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // ECMA-262, section 15.10.7.4. 10405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor field(factory->multiline_string(), 104125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org JSRegExp::kMultilineFieldIndex, 1042f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org final, 1043f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 10442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&field); 104525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org } 104625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org { 104725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // ECMA-262, section 15.10.7.5. 104825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org PropertyAttributes writable = 104925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 10505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor field(factory->last_index_string(), 105125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org JSRegExp::kLastIndexFieldIndex, 1052f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org writable, 1053f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 10542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&field); 105525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org } 105625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 105725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org initial_map->set_inobject_properties(5); 105825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org initial_map->set_pre_allocated_property_fields(5); 105925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org initial_map->set_unused_property_fields(0); 106025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org initial_map->set_instance_size( 106125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org initial_map->instance_size() + 5 * kPointerSize); 1062ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); 1063c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1064c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // RegExp prototype object is itself a RegExp. 1065ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Handle<Map> proto_map = Map::Copy(initial_map); 106646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org proto_map->set_prototype(native_context()->initial_object_prototype()); 1067c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map); 1068c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, 10694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org heap->query_colon_string()); 1070c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, 1071c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->false_value()); 1072c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, 1073c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->false_value()); 1074c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, 1075c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->false_value()); 1076c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, 1077c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Smi::FromInt(0), 1078c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SKIP_WRITE_BARRIER); // It's a Smi. 1079c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com initial_map->set_prototype(*proto); 1080c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), 1081c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JSRegExp::IRREGEXP, factory->empty_string(), 1082c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JSRegExp::Flags(0), 0); 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10853a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org { // -- J S O N 10868e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org Handle<String> name = factory->InternalizeUtf8String("JSON"); 10873c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> cons = factory->NewFunction(name); 1088ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org JSFunction::SetInstancePrototype(cons, 1089ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Handle<Object>(native_context()->initial_object_prototype(), isolate)); 10903a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org cons->SetInstanceClassName(*name); 10917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED); 10923a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org ASSERT(json_object->IsJSObject()); 1093fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 10948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org global, name, json_object, DONT_ENUM).Check(); 109546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_json_object(*json_object); 10963a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org } 10973a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org 1098e7553c2faf3f3a5539d2561d024ab1e9a527d8famvstanton@chromium.org { // -- A r r a y B u f f e r 109932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org Handle<JSFunction> array_buffer_fun = 110032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org InstallFunction( 110132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE, 110232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org JSArrayBuffer::kSizeWithInternalFields, 110332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org isolate->initial_object_prototype(), 11043c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 110532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org native_context()->set_array_buffer_fun(*array_buffer_fun); 110632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 110732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 1108e7553c2faf3f3a5539d2561d024ab1e9a527d8famvstanton@chromium.org { // -- T y p e d A r r a y s 1109af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ 1110af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org { \ 1111a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<JSFunction> fun; \ 1112a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Map> external_map; \ 1113a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org InstallTypedArray(#Type "Array", \ 1114a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org TYPE##_ELEMENTS, \ 1115a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org &fun, \ 1116a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org &external_map); \ 1117af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org native_context()->set_##type##_array_fun(*fun); \ 1118a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org native_context()->set_##type##_array_external_map(*external_map); \ 1119af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 1120af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org TYPED_ARRAYS(INSTALL_TYPED_ARRAY) 1121af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef INSTALL_TYPED_ARRAY 112232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 112332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org Handle<JSFunction> data_view_fun = 112432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org InstallFunction( 112532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org global, "DataView", JS_DATA_VIEW_TYPE, 112632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org JSDataView::kSizeWithInternalFields, 112732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org isolate->initial_object_prototype(), 11283c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 112932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org native_context()->set_data_view_fun(*data_view_fun); 113032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 113132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 11323c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // -- W e a k M a p 11333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, 11343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate->initial_object_prototype(), Builtins::kIllegal); 11353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // -- W e a k S e t 11363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, 11373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate->initial_object_prototype(), Builtins::kIllegal); 11385924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 113943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- arguments_boilerplate_ 114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Make sure we can recognize argument objects at runtime. 114143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // This is done by introducing an anonymous function with 114243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // class_name equals 'Arguments'. 11434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> arguments_string = factory->InternalizeOneByteString( 1144a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org STATIC_ASCII_VECTOR("Arguments")); 1145a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); 11465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 11473c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( 11483c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org arguments_string, code); 11495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org ASSERT(!function->has_initial_map()); 11504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org function->shared()->set_instance_class_name(*arguments_string); 11515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org function->shared()->set_expected_nof_properties(2); 11523c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org function->set_prototype_or_initial_map( 11533c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org native_context()->object_function()->prototype()); 11547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<JSObject> result = factory->NewJSObject(function); 115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1156486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_sloppy_arguments_boilerplate(*result); 1157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Note: length must be added as the first property and 1158ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // callee must be added as the second property. 1159fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 11608f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org result, factory->length_string(), 11618f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory->undefined_value(), DONT_ENUM, 11628f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Object::FORCE_TAGGED, FORCE_FIELD).Check(); 1163fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 11648f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org result, factory->callee_string(), 11658f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory->undefined_value(), DONT_ENUM, 11668f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Object::FORCE_TAGGED, FORCE_FIELD).Check(); 116743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#ifdef DEBUG 1169394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LookupResult lookup(isolate); 1170fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org result->LookupOwn(factory->callee_string(), &lookup); 1171de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org ASSERT(lookup.IsField()); 1172e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org ASSERT(lookup.GetFieldIndex().property_index() == 1173e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org Heap::kArgumentsCalleeIndex); 1174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1175fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org result->LookupOwn(factory->length_string(), &lookup); 1176de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org ASSERT(lookup.IsField()); 1177e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org ASSERT(lookup.GetFieldIndex().property_index() == 1178e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org Heap::kArgumentsLengthIndex); 1179ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(result->map()->inobject_properties() > Heap::kArgumentsCalleeIndex); 1181ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); 1182ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1183ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Check the state of the object. 1184ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(result->HasFastProperties()); 1185830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org ASSERT(result->HasFastObjectElements()); 1186ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 1187ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1188ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 11897b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org { // --- aliased_arguments_boilerplate_ 11907b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org // Set up a well-formed parameter map to make assertions happy. 11917b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org Handle<FixedArray> elements = factory->NewFixedArray(2); 1192486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org elements->set_map(heap->sloppy_arguments_elements_map()); 11937b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org Handle<FixedArray> array; 11947b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org array = factory->NewFixedArray(0); 11957b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org elements->set(0, *array); 11967b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org array = factory->NewFixedArray(0); 11977b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org elements->set(1, *array); 1198394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 1199486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Handle<Map> old_map( 1200486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->sloppy_arguments_boilerplate()->map()); 1201ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Handle<Map> new_map = Map::Copy(old_map); 1202394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com new_map->set_pre_allocated_property_fields(2); 1203394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<JSObject> result = factory->NewJSObjectFromMap(new_map); 1204394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Set elements kind after allocating the object because 1205394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // NewJSObjectFromMap assumes a fast elements map. 1206486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org new_map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); 12077b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org result->set_elements(*elements); 1208486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ASSERT(result->HasSloppyArgumentsElements()); 120946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_aliased_arguments_boilerplate(*result); 12107b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org } 12117b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 1212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // --- strict mode arguments boilerplate 1213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const PropertyAttributes attributes = 1214ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 1215ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1216ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Create the ThrowTypeError functions. 1217f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<AccessorPair> callee = factory->NewAccessorPair(); 1218f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<AccessorPair> caller = factory->NewAccessorPair(); 1219ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 122054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> poison = GetStrictPoisonFunction(); 1221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Install the ThrowTypeError functions. 122354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org callee->set_getter(*poison); 122454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org callee->set_setter(*poison); 122554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org caller->set_getter(*poison); 122654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org caller->set_setter(*poison); 1227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1228304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org // Create the map. Allocate one in-object field for length. 1229304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, 1230486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org Heap::kStrictArgumentsObjectSize); 1231ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Create the descriptor array for the arguments object. 12322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(map, 3); 1233304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 1234ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // length 1235f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org FieldDescriptor d( 12365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org factory->length_string(), 0, DONT_ENUM, Representation::Tagged()); 12372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 1238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // callee 12405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CallbacksDescriptor d(factory->callee_string(), 12415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org callee, 124228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org attributes); 12432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 1244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1245ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // caller 12465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CallbacksDescriptor d(factory->caller_string(), 12475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org caller, 124828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org attributes); 12492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org map->AppendDescriptor(&d); 1250ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1251ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map->set_function_with_prototype(true); 125346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org map->set_prototype(native_context()->object_function()->prototype()); 1254ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map->set_pre_allocated_property_fields(1); 1255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map->set_inobject_properties(1); 1256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1257486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // Copy constructor from the sloppy arguments boilerplate. 1258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map->set_constructor( 1259486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->sloppy_arguments_boilerplate()->map()->constructor()); 1260ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1261ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allocate the arguments boilerplate object. 12627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<JSObject> result = factory->NewJSObjectFromMap(map); 1263486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_strict_arguments_boilerplate(*result); 1264ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1265ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Add length property only for strict mode boilerplate. 1266fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 12678f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org result, factory->length_string(), 12688f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory->undefined_value(), DONT_ENUM).Check(); 12695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1270ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#ifdef DEBUG 1271394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LookupResult lookup(isolate); 1272fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org result->LookupOwn(factory->length_string(), &lookup); 1273de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org ASSERT(lookup.IsField()); 1274e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org ASSERT(lookup.GetFieldIndex().property_index() == 1275e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org Heap::kArgumentsLengthIndex); 12765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1277ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); 12785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 127943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check the state of the object. 128043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(result->HasFastProperties()); 1281830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org ASSERT(result->HasFastObjectElements()); 12825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#endif 128343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 128443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 128543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // --- context extension 128643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Create a function for the context extension objects. 1287ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Handle<Code> code = Handle<Code>( 12887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->builtins()->builtin(Builtins::kIllegal)); 12893c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> context_extension_fun = factory->NewFunction( 12903c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, 12913c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org JSObject::kHeaderSize); 129243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> name = factory->InternalizeOneByteString( 12944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org STATIC_ASCII_VECTOR("context_extension")); 129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen context_extension_fun->shared()->set_instance_class_name(*name); 129646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_context_extension_function(*context_extension_fun); 129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 129843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 129905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org 130005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org { 130180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org // Set up the call-as-function delegate. 130205521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org Handle<Code> code = 13037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<Code>(isolate->builtins()->builtin( 13047979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kHandleApiCallAsFunction)); 13053c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> delegate = factory->NewFunction( 13063c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); 130746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_call_as_function_delegate(*delegate); 130805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org delegate->shared()->DontAdaptArguments(); 130905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org } 131005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org 131105521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org { 131280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org // Set up the call-as-constructor delegate. 131305521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org Handle<Code> code = 13147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Handle<Code>(isolate->builtins()->builtin( 13157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kHandleApiCallAsConstructor)); 13163c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> delegate = factory->NewFunction( 13173c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); 131846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_call_as_constructor_delegate(*delegate); 131905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org delegate->shared()->DontAdaptArguments(); 132005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org } 132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1322eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // Initialize the embedder data slot. 13234f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org Handle<FixedArray> embedder_data = factory->NewFixedArray(3); 1324eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org native_context()->set_embedder_data(*embedder_data); 132543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 132643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 132743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1328a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgvoid Genesis::InstallTypedArray( 1329a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org const char* name, 1330a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ElementsKind elements_kind, 1331a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<JSFunction>* fun, 1332a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Map>* external_map) { 1333e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 13343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> result = InstallFunction( 13353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, 13363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 13374e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 13384e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org Handle<Map> initial_map = isolate()->factory()->NewMap( 1339a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org JS_TYPED_ARRAY_TYPE, 1340a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org JSTypedArray::kSizeWithInternalFields, 1341a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org elements_kind); 13424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org result->set_initial_map(*initial_map); 13434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org initial_map->set_constructor(*result); 1344a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org *fun = result; 1345a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org 1346a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); 1347a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org *external_map = Map::AsElementsKind(initial_map, external_kind); 1348e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1349e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1350e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 13517c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgvoid Genesis::InitializeExperimentalGlobal() { 135246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 13537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 13547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no 1355f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // longer need to live behind flags, so functions get added to the snapshot. 1356f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 1357f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (FLAG_harmony_symbols) { 1358f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // --- S y m b o l --- 13593c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> symbol_fun = InstallFunction( 13603c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, 13613c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 1362f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org native_context()->set_symbol_function(*symbol_fun); 1363f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 1364f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 1365394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_harmony_collections) { 13663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // -- M a p 13673c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize, 13683c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 13693c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // -- S e t 13703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize, 13713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 13724ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org { // -- S e t I t e r a t o r 1373196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Handle<JSObject> builtins(native_context()->builtins()); 1374196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Handle<JSFunction> set_iterator_function = 1375196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org InstallFunction(builtins, "SetIterator", JS_SET_ITERATOR_TYPE, 1376196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org JSSetIterator::kSize, 1377196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org isolate()->initial_object_prototype(), 1378196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Builtins::kIllegal); 1379196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org native_context()->set_set_iterator_map( 1380196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org set_iterator_function->initial_map()); 13814ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org } 13824ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org { // -- M a p I t e r a t o r 1383196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Handle<JSObject> builtins(native_context()->builtins()); 1384196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Handle<JSFunction> map_iterator_function = 1385196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org InstallFunction(builtins, "MapIterator", JS_MAP_ITERATOR_TYPE, 1386196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org JSMapIterator::kSize, 1387196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org isolate()->initial_object_prototype(), 1388196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org Builtins::kIllegal); 1389196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org native_context()->set_map_iterator_map( 1390196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org map_iterator_function->initial_map()); 13914ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org } 13924452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org } 13934452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1394e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (FLAG_harmony_generators) { 1395e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Create generator meta-objects and install them on the builtins object. 1396e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<JSObject> builtins(native_context()->builtins()); 1397e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<JSObject> generator_object_prototype = 1398e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org factory()->NewJSObject(isolate()->object_function(), TENURED); 13993c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> generator_function_prototype = InstallFunction( 14003c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org builtins, "GeneratorFunctionPrototype", JS_FUNCTION_TYPE, 14013c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org JSFunction::kHeaderSize, generator_object_prototype, 14023c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Builtins::kIllegal); 1403e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org InstallFunction(builtins, "GeneratorFunction", 1404e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JS_FUNCTION_TYPE, JSFunction::kSize, 14053c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org generator_function_prototype, Builtins::kIllegal); 1406e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1407e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Create maps for generator functions and their prototypes. Store those 1408e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // maps in the native context. 140954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<Map> sloppy_function_map(native_context()->sloppy_function_map()); 141054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<Map> generator_function_map = Map::Copy(sloppy_function_map); 1411e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org generator_function_map->set_prototype(*generator_function_prototype); 1412486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_sloppy_generator_function_map( 1413486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org *generator_function_map); 1414e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 141554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // The "arguments" and "caller" instance properties aren't specified, so 141654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // technically we could leave them out. They make even less sense for 141754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // generators than for functions. Still, the same argument that it makes 141854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // sense to keep them around but poisoned in strict mode applies to 141954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // generators as well. With poisoned accessors, naive callers can still 142054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // iterate over the properties without accessing them. 142154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // 142254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // We can't use PoisonArgumentsAndCaller because that mutates accessor pairs 142354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // in place, and the initial state of the generator function map shares the 142454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // accessor pair with sloppy functions. Also the error message should be 142554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // different. Also unhappily, we can't use the API accessors to implement 142654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // poisoning, because API accessors present themselves as data properties, 142754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // not accessor properties, and so getOwnPropertyDescriptor raises an 142854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // exception as it tries to get the values. Sadness. 142954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<AccessorPair> poison_pair(factory()->NewAccessorPair()); 143054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org PropertyAttributes rw_attribs = 143154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 143254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> poison_function = GetGeneratorPoisonFunction(); 143354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org poison_pair->set_getter(*poison_function); 143454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org poison_pair->set_setter(*poison_function); 143554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org ReplaceAccessors(generator_function_map, factory()->arguments_string(), 143654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org rw_attribs, poison_pair); 143754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org ReplaceAccessors(generator_function_map, factory()->caller_string(), 143854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org rw_attribs, poison_pair); 143954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 144054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<Map> strict_function_map(native_context()->strict_function_map()); 144154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<Map> strict_generator_function_map = Map::Copy(strict_function_map); 144254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // "arguments" and "caller" already poisoned. 144354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org strict_generator_function_map->set_prototype(*generator_function_prototype); 1444486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_strict_generator_function_map( 144554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org *strict_generator_function_map); 1446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 14474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org Handle<JSFunction> object_function(native_context()->object_function()); 14484edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org Handle<Map> generator_object_prototype_map = Map::Create( 14494edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org object_function, 0); 1450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org generator_object_prototype_map->set_prototype( 1451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *generator_object_prototype); 1452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org native_context()->set_generator_object_prototype_map( 1453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *generator_object_prototype_map); 14544ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org } 14554ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org 14564ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org if (FLAG_harmony_collections || FLAG_harmony_generators) { 14574ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // Collection forEach uses an iterator result object. 14584ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org // Generators return iteraror result objects. 145957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 146057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2); 14614ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org Handle<JSFunction> object_function(native_context()->object_function()); 14624ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org ASSERT(object_function->initial_map()->inobject_properties() == 0); 14634ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org Handle<Map> iterator_result_map = Map::Create( 14644edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org object_function, JSGeneratorObject::kResultPropertyCount); 14654ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org ASSERT(iterator_result_map->inobject_properties() == 146657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org JSGeneratorObject::kResultPropertyCount); 14672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack( 14684ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org iterator_result_map, JSGeneratorObject::kResultPropertyCount); 146957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 14704ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org FieldDescriptor value_descr(isolate()->factory()->value_string(), 147157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org JSGeneratorObject::kResultValuePropertyIndex, 147257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org NONE, 147357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Representation::Tagged()); 14744ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org iterator_result_map->AppendDescriptor(&value_descr); 147557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 14764ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org FieldDescriptor done_descr(isolate()->factory()->done_string(), 147757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org JSGeneratorObject::kResultDonePropertyIndex, 147857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org NONE, 147957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Representation::Tagged()); 14804ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org iterator_result_map->AppendDescriptor(&done_descr); 148157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 14824ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org iterator_result_map->set_unused_property_fields(0); 148357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org ASSERT_EQ(JSGeneratorObject::kResultSize, 14844ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org iterator_result_map->instance_size()); 14854ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org native_context()->set_iterator_result_map(*iterator_result_map); 1486f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 14877c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} 14887c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 14897c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1490160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgbool Genesis::CompileBuiltin(Isolate* isolate, int index) { 149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Vector<const char> name = Natives::GetScriptName(index); 1492ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Handle<String> source_code = 1493160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org isolate->bootstrapper()->NativesSourceLookup(index); 1494c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return CompileNative(isolate, name, source_code); 1495160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 1496160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1497160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1498160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgbool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { 1499160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Vector<const char> name = ExperimentalNatives::GetScriptName(index); 1500160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Factory* factory = isolate->factory(); 15018496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<String> source_code; 15028496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org ASSIGN_RETURN_ON_EXCEPTION_VALUE( 15038496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org isolate, source_code, 1504e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org factory->NewStringFromAscii( 15058496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org ExperimentalNatives::GetRawScriptSource(index)), 15068496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org false); 1507c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return CompileNative(isolate, name, source_code); 150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1511c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgbool Genesis::CompileNative(Isolate* isolate, 1512c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Vector<const char> name, 1513c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<String> source) { 1514c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate); 15158d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org SuppressDebug compiling_natives(isolate->debug()); 15167d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // During genesis, the boilerplate for stack overflow won't work until the 15177d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // environment has been at least partially initialized. Add a stack check 15187d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // before entering JS code to catch overflow early. 1519c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org StackLimitCheck check(isolate); 15207d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org if (check.HasOverflowed()) return false; 15217d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 1522c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org bool result = CompileScriptCached(isolate, 1523c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org name, 15245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org source, 15255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org NULL, 15265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org NULL, 1527ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Handle<Context>(isolate->context()), 15285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org true); 1529ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(isolate->has_pending_exception() != result); 1530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!result) isolate->clear_pending_exception(); 153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1535c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgbool Genesis::CompileScriptCached(Isolate* isolate, 1536c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Vector<const char> name, 153743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<String> source, 153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SourceCodeCache* cache, 153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Extension* extension, 15405d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Context> top_context, 154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool use_runtime_context) { 1542c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Factory* factory = isolate->factory(); 1543c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate); 15445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<SharedFunctionInfo> function_info; 154543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 154643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If we can't find the function in the cache, we compile a new 154743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // function and insert it into the cache. 15485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (cache == NULL || !cache->Lookup(name, &function_info)) { 15498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ASSERT(source->IsOneByteRepresentation()); 15508496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org Handle<String> script_name = 15518496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org factory->NewStringFromUtf8(name).ToHandleChecked(); 15524954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info = Compiler::CompileScript( 15535d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org source, 15545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org script_name, 15555d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 0, 15565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 0, 1557d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org false, 1558355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org top_context, 15595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org extension, 15605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org NULL, 156169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org NO_CACHED_DATA, 15625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org use_runtime_context ? NATIVES_CODE : NOT_NATIVES_CODE); 15635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (function_info.is_null()) return false; 15645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (cache != NULL) cache->Add(name, function_info); 156543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1567f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up the function context. Conceptually, we should clone the 156843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // function before overwriting the context but since we're in a 156943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // single-threaded environment it is not strictly necessary. 157046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(top_context->IsNativeContext()); 157143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Context> context = 157243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Context>(use_runtime_context 15735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ? Handle<Context>(top_context->runtime_context()) 15745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org : top_context); 157543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> fun = 15767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org factory->NewFunctionFromSharedFunctionInfo(function_info, context); 157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1578b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Call function using either the runtime object or the global 157943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // object as the receiver. Provide no parameters. 158043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object> receiver = 158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Object>(use_runtime_context 15825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ? top_context->builtins() 158309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org : top_context->global_object(), 158409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate); 15852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return !Execution::Call( 15862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate, fun, receiver, 0, NULL).is_null(); 158743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 158943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15905b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#define INSTALL_NATIVE(Type, name, var) \ 15915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<String> var##_name = \ 15922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR(name)); \ 15932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> var##_native = Object::GetProperty( \ 15942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org handle(native_context()->builtins()), var##_name).ToHandleChecked(); \ 15955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org native_context()->set_##var(Type::cast(*var##_native)); 159643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 159843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Genesis::InstallNativeFunctions() { 1599c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate()); 160043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); 16015924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 160243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); 160343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); 160443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); 160543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); 160643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); 160743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun); 160843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); 16095924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 16100c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); 161143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun); 161243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "ConfigureTemplateInstance", 161343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen configure_instance_fun); 161443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun); 161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INSTALL_NATIVE(JSObject, "functionCache", function_cache); 1616c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor", 1617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com to_complete_property_descriptor); 16185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 16195924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "IsPromise", is_promise); 16205924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseCreate", promise_create); 16215924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseResolve", promise_resolve); 16225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseReject", promise_reject); 16235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseChain", promise_chain); 16245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseCatch", promise_catch); 16251845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org INSTALL_NATIVE(JSFunction, "PromiseThen", promise_then); 16265924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 162797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "NotifyChange", observers_notify_change); 162897b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "EnqueueSpliceRecord", observers_enqueue_splice); 162997b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "BeginPerformSplice", 163097b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org observers_begin_perform_splice); 163197b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org INSTALL_NATIVE(JSFunction, "EndPerformSplice", 163297b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org observers_end_perform_splice); 1633c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org INSTALL_NATIVE(JSFunction, "NativeObjectObserve", 1634c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org native_object_observe); 1635c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org INSTALL_NATIVE(JSFunction, "NativeObjectGetNotifier", 1636c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org native_object_get_notifier); 1637c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org INSTALL_NATIVE(JSFunction, "NativeObjectNotifierPerformChange", 1638c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org native_object_notifier_perform_change); 163943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1641e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1642ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid Genesis::InstallExperimentalNativeFunctions() { 1643ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org if (FLAG_harmony_proxies) { 1644717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org INSTALL_NATIVE(JSFunction, "DerivedHasTrap", derived_has_trap); 1645ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org INSTALL_NATIVE(JSFunction, "DerivedGetTrap", derived_get_trap); 1646d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org INSTALL_NATIVE(JSFunction, "DerivedSetTrap", derived_set_trap); 1647394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com INSTALL_NATIVE(JSFunction, "ProxyEnumerate", proxy_enumerate); 1648ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org } 16491845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 16501845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (FLAG_harmony_symbols) { 16511845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org INSTALL_NATIVE(Symbol, "symbolIterator", iterator_symbol); 16521845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org } 1653ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org} 1654ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 165543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef INSTALL_NATIVE 165643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 165743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1658c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgHandle<JSFunction> Genesis::InstallInternalArray( 1659c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<JSBuiltinsObject> builtins, 1660c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org const char* name, 1661c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org ElementsKind elements_kind) { 1662c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // --- I n t e r n a l A r r a y --- 1663c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // An array constructor on the builtins object that works like 1664c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // the public Array constructor, except that its prototype 1665c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // doesn't inherit from Object.prototype. 1666c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // To be used only for internal work by builtins. Instances 1667c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // must not be leaked to user code. 1668c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<JSObject> prototype = 1669c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org factory()->NewJSObject(isolate()->object_function(), TENURED); 16703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> array_function = InstallFunction( 16713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org builtins, name, JS_ARRAY_TYPE, JSArray::kSize, 16723c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org prototype, Builtins::kInternalArrayCode); 1673c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 16741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStub internal_array_constructor_stub(isolate()); 1675f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Handle<Code> code = internal_array_constructor_stub.GetCode(); 16761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_function->shared()->set_construct_stub(*code); 1677c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org array_function->shared()->DontAdaptArguments(); 1678c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1679b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Map> original_map(array_function->initial_map()); 1680ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Handle<Map> initial_map = Map::Copy(original_map); 1681b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org initial_map->set_elements_kind(elements_kind); 1682b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org array_function->set_initial_map(*initial_map); 1683c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1684c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // Make "length" magic on instances. 16852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(initial_map, 1); 1686c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1687c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PropertyAttributes attribs = static_cast<PropertyAttributes>( 1688c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org DONT_ENUM | DONT_DELETE); 1689c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 16903484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<AccessorInfo> array_length = 16913484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Accessors::ArrayLengthInfo(isolate(), attribs); 1692c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org { // Add length. 1693c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org CallbacksDescriptor d( 16943484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<Name>(Name::cast(array_length->name())), array_length, attribs); 16952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org array_function->initial_map()->AppendDescriptor(&d); 1696c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 1697c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1698c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return array_function; 1699c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org} 1700c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1701c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 170243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Genesis::InstallNatives() { 1703c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate()); 170443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 170543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Create a function for the builtins object. Allocate space for the 170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // JavaScript builtins, a reference to the builtins object 170746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // (itself) and a reference to the native_context directly in the object. 1708ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Handle<Code> code = Handle<Code>( 1709160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org isolate()->builtins()->builtin(Builtins::kIllegal)); 17103c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> builtins_fun = factory()->NewFunction( 17113c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org factory()->empty_string(), code, JS_BUILTINS_OBJECT_TYPE, 17123c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org JSBuiltinsObject::kSize); 171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1714a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Handle<String> name = 17154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins")); 171643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen builtins_fun->shared()->set_instance_class_name(*name); 171788767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com builtins_fun->initial_map()->set_dictionary_map(true); 1718de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org builtins_fun->initial_map()->set_prototype(heap()->null_value()); 171943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the builtins object. 172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSBuiltinsObject> builtins = 1722160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<JSBuiltinsObject>::cast(factory()->NewGlobalObject(builtins_fun)); 172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen builtins->set_builtins(*builtins); 172446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org builtins->set_native_context(*native_context()); 1725355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org builtins->set_global_context(*native_context()); 17265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org builtins->set_global_receiver(*builtins); 17279ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org builtins->set_global_receiver(native_context()->global_proxy()); 17289ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org 172943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1730f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up the 'global' properties of the builtins object. The 173143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 'global' property that refers to the global object is the only 173243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // way to get from code running in the builtins context to the 173343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // global object. 173443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const PropertyAttributes attributes = 173543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); 17364a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> global_string = 17374a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("global")); 173809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> global_obj(native_context()->global_object(), isolate()); 1739fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 17408f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org builtins, global_string, global_obj, attributes).Check(); 17419ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org Handle<String> builtins_string = 17429ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins")); 1743fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 17448f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org builtins, builtins_string, builtins, attributes).Check(); 174543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1746f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up the reference from the global object to the builtins object. 174746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org JSGlobalObject::cast(native_context()->global_object())-> 174846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org set_builtins(*builtins); 174943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Create a bridge function that has context in the native context. 17513c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string()); 175246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(bridge->context() == *isolate()->native_context()); 175343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the builtins context. 175543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Context> context = 1756160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); 175746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_global_object(*builtins); // override builtins global object 175843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_runtime_context(*context); 176043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 176143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { // -- S c r i p t 176243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Builtin functions for Script. 17633c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> script_fun = InstallFunction( 17643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, 17653c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 176643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSObject> prototype = 1767160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewJSObject(isolate()->object_function(), TENURED); 1768ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org Accessors::FunctionSetPrototype(script_fun, prototype); 176946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_script_function(*script_fun); 177043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 177143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); 17722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(script_map, 13); 1773304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 1774304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org PropertyAttributes attribs = 1775304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 177643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_column = 17789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptColumnOffsetInfo(isolate(), attribs); 1779304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 17809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_column->name())), 17819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_column, attribs); 17822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1783304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1784304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 17859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_id = 17869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptIdInfo(isolate(), attribs); 1787304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 17889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_id->name())), 17899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_id, attribs); 17902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1791304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1792304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 17939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 17949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_name = 17959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptNameInfo(isolate(), attribs); 1796304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 17979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_name->name())), 17989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_name, attribs); 17992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1800304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1801304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_line = 18039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptLineOffsetInfo(isolate(), attribs); 1804304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 18059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_line->name())), 18069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_line, attribs); 18072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1808304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1809304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_source = 18119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptSourceInfo(isolate(), attribs); 1812304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 18139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_source->name())), 18149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_source, attribs); 18152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1816304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1817304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_type = 18199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptTypeInfo(isolate(), attribs); 1820304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 18219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_type->name())), 18229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_type, attribs); 18232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1824304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1825304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_compilation_type = 18279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptCompilationTypeInfo(isolate(), attribs); 1828304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 1829304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor d( 18309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name>(Name::cast(script_compilation_type->name())), 18319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_compilation_type, attribs); 18322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1833304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1834304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_line_ends = 18369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptLineEndsInfo(isolate(), attribs); 1837304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 18389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CallbacksDescriptor d(Handle<Name>(Name::cast(script_line_ends->name())), 18399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_line_ends, attribs); 18402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1841304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1842304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_context_data = 18449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptContextDataInfo(isolate(), attribs); 1845304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 1846304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor d( 18479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name>(Name::cast(script_context_data->name())), 18489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_context_data, attribs); 18492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1850304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1851304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_eval_from_script = 18539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptEvalFromScriptInfo(isolate(), attribs); 1854304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 1855304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor d( 18569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name>(Name::cast(script_eval_from_script->name())), 18579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_eval_from_script, attribs); 18582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1859304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1860304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_eval_from_script_position = 18629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptEvalFromScriptPositionInfo(isolate(), attribs); 1863304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 1864304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor d( 18659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name>(Name::cast(script_eval_from_script_position->name())), 18669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_eval_from_script_position, attribs); 18672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1868304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1869304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 18709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<AccessorInfo> script_eval_from_function_name = 18719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Accessors::ScriptEvalFromFunctionNameInfo(isolate(), attribs); 1872304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 1873304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor d( 18749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Name>(Name::cast(script_eval_from_function_name->name())), 18759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org script_eval_from_function_name, attribs); 18762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org script_map->AppendDescriptor(&d); 1877304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 1878304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 187943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the empty script. 1880160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Script> script = factory()->NewScript(factory()->empty_string()); 1881e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 1882160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org heap()->public_set_empty_script(*script); 188343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1884ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org { 1885ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Builtin function for OpaqueReference -- a JSValue-based object, 1886ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // that keeps its field isolated from JavaScript code. It may store 1887ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // objects, that JavaScript code may not access. 18883c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Handle<JSFunction> opaque_reference_fun = InstallFunction( 18893c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org builtins, "OpaqueReference", JS_VALUE_TYPE, JSValue::kSize, 18903c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate()->initial_object_prototype(), Builtins::kIllegal); 1891ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org Handle<JSObject> prototype = 1892160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewJSObject(isolate()->object_function(), TENURED); 1893ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org Accessors::FunctionSetPrototype(opaque_reference_fun, prototype); 189446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_opaque_reference_function(*opaque_reference_fun); 1895ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 189643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1897c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // InternalArrays should not use Smi-Only array optimizations. There are too 1898c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // many places in the C++ runtime code (e.g. RegEx) that assume that 1899c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // elements in InternalArrays can be set to non-Smi values without going 1900c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT 1901c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org // transition easy to trap. Moreover, they rarely are smi-only. 1902c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org { 1903c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<JSFunction> array_function = 1904c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org InstallInternalArray(builtins, "InternalArray", FAST_HOLEY_ELEMENTS); 190546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_internal_array_function(*array_function); 19068f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org } 19078f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org 1908c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org { 1909b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org InstallInternalArray(builtins, "InternalPackedArray", FAST_ELEMENTS); 1910c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 1911c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 19125d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (FLAG_disable_native_files) { 191343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Warning: Running without installed natives!\n"); 191443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 191543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Install natives. 19185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org for (int i = Natives::GetDebuggerCount(); 19195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org i < Natives::GetBuiltinsCount(); 19205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org i++) { 1921160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (!CompileBuiltin(isolate(), i)) return false; 19225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // TODO(ager): We really only need to install the JS builtin 19235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // functions on the builtins object after compiling and running 19245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // runtime.js. 19255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!InstallJSBuiltins(builtins)) return false; 19265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 19275d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 192843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InstallNativeFunctions(); 192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1930ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // Store the map for the string prototype after the natives has been compiled 1931f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // and the String function has been set up. 193246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<JSFunction> string_function(native_context()->string_function()); 1933ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ASSERT(JSObject::cast( 1934ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org string_function->initial_map()->prototype())->HasFastProperties()); 193546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_string_function_prototype_map( 1936ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject::cast(string_function->initial_map()->prototype())->map()); 1937ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1938b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Install Function.prototype.call and apply. 19394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org { Handle<String> key = factory()->function_class_string(); 1940b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org Handle<JSFunction> function = 19412f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Handle<JSFunction>::cast(Object::GetProperty( 19422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org isolate()->global_object(), key).ToHandleChecked()); 194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSObject> proto = 194443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSObject>(JSObject::cast(function->instance_prototype())); 1945b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 1946b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Install the call and the apply functions. 194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSFunction> call = 1948b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize, 19493c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org MaybeHandle<JSObject>(), Builtins::kFunctionCall); 1950b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org Handle<JSFunction> apply = 1951b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize, 19523c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org MaybeHandle<JSObject>(), Builtins::kFunctionApply); 195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 195443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Make sure that Function.prototype.call appears to be compiled. 195543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The code will never be called, but inline caching for call will 195643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // only work if it appears to be compiled. 1957b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org call->shared()->DontAdaptArguments(); 195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(call->is_compiled()); 195943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Set the expected parameters for apply to 2; required by builtin. 1961b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org apply->shared()->set_formal_parameter_count(2); 1962b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 1963b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Set the lengths for the functions to satisfy ECMA-262. 1964b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org call->shared()->set_length(1); 1965b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org apply->shared()->set_length(2); 196643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 196743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19684acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org InstallBuiltinFunctionIds(); 19694acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 1970b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Create a constructor for RegExp results (a variant of Array that 1971b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // predefines the two properties index and match). 1972b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org { 1973b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // RegExpResult initial map. 1974b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1975b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Find global.Array.prototype to inherit from. 197646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<JSFunction> array_constructor(native_context()->array_function()); 1977b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org Handle<JSObject> array_prototype( 1978b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org JSObject::cast(array_constructor->instance_prototype())); 1979b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1980b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Add initial map. 1981b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org Handle<Map> initial_map = 1982160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); 1983b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_constructor(*array_constructor); 1984b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1985b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Set prototype on map. 1986b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_non_instance_prototype(false); 1987b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_prototype(*array_prototype); 1988b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1989b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Update map with length accessor from Array and add "index" and "input". 19902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Map::EnsureDescriptorSlack(initial_map, 3); 1991394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 1992304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org { 199346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org JSFunction* array_function = native_context()->array_function(); 1994304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Handle<DescriptorArray> array_descriptors( 1995304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org array_function->initial_map()->instance_descriptors()); 19965b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<String> length = factory()->length_string(); 199706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org int old = array_descriptors->SearchWithCache( 19985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org *length, array_function->initial_map()); 1999304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org ASSERT(old != DescriptorArray::kNotFound); 2000304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org CallbacksDescriptor desc(length, 20015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org handle(array_descriptors->GetValue(old), 20025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org isolate()), 2003304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org array_descriptors->GetDetails(old).attributes()); 20042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&desc); 2005304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2006b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org { 20075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor index_field(factory()->index_string(), 2008b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org JSRegExpResult::kIndexIndex, 2009f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org NONE, 2010f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 20112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&index_field); 2012b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 2013b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 2014b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org { 20155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org FieldDescriptor input_field(factory()->input_string(), 2016b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org JSRegExpResult::kInputIndex, 2017f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org NONE, 2018f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Representation::Tagged()); 20192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org initial_map->AppendDescriptor(&input_field); 2020b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 2021b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 2022b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_inobject_properties(2); 2023b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_pre_allocated_property_fields(2); 2024b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org initial_map->set_unused_property_fields(0); 2025b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 202646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_regexp_result_map(*initial_map); 2027b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 2028b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 2029c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 2030ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org builtins->ObjectVerify(); 203143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 20325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 203343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 203443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 203543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 203643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20379f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org#define INSTALL_EXPERIMENTAL_NATIVE(i, flag, file) \ 20389f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org if (FLAG_harmony_##flag && \ 20399f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org strcmp(ExperimentalNatives::GetScriptName(i).start(), \ 20409f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org "native " file) == 0) { \ 20419f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org if (!CompileExperimentalBuiltin(isolate(), i)) return false; \ 20429f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org } 20439f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org 20449f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org 2045160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgbool Genesis::InstallExperimentalNatives() { 20467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org for (int i = ExperimentalNatives::GetDebuggerCount(); 20477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org i < ExperimentalNatives::GetBuiltinsCount(); 20487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org i++) { 20499f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, symbols, "symbol.js") 20509f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, proxies, "proxy.js") 20519f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, collections, "collection.js") 2052196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, collections, "collection-iterator.js") 20539f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, generators, "generator.js") 20549f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, iteration, "array-iterator.js") 20559f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, strings, "harmony-string.js") 20569f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, arrays, "harmony-array.js") 20579f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org INSTALL_EXPERIMENTAL_NATIVE(i, maths, "harmony-math.js") 2058160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2059ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 2060ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org InstallExperimentalNativeFunctions(); 2061f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org InstallExperimentalBuiltinFunctionIds(); 2062160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org return true; 2063160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2064160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2065160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 20665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgstatic Handle<JSObject> ResolveBuiltinIdHolder( 206746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<Context> native_context, 2068c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org const char* holder_expr) { 206909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Isolate* isolate = native_context->GetIsolate(); 207009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Factory* factory = isolate->factory(); 207146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<GlobalObject> global(native_context->global_object()); 2072c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org const char* period_pos = strchr(holder_expr, '.'); 2073c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org if (period_pos == NULL) { 20742f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return Handle<JSObject>::cast(Object::GetPropertyOrElement( 2075202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org global, factory->InternalizeUtf8String(holder_expr)).ToHandleChecked()); 20762ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org } 2077c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org ASSERT_EQ(".prototype", period_pos); 2078c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org Vector<const char> property(holder_expr, 2079c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org static_cast<int>(period_pos - holder_expr)); 2080b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org Handle<String> property_string = factory->InternalizeUtf8String(property); 2081b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org ASSERT(!property_string.is_null()); 2082c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org Handle<JSFunction> function = Handle<JSFunction>::cast( 20832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object::GetProperty(global, property_string).ToHandleChecked()); 2084c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org return Handle<JSObject>(JSObject::cast(function->prototype())); 2085c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org} 2086c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2087c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 20885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgstatic void InstallBuiltinFunctionId(Handle<JSObject> holder, 20895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org const char* function_name, 20905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org BuiltinFunctionId id) { 20919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Isolate* isolate = holder->GetIsolate(); 20922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> function_object = 20939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Object::GetProperty(isolate, holder, function_name).ToHandleChecked(); 20945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); 2095720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org function->shared()->set_function_data(Smi::FromInt(id)); 2096720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2097720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2098720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 20995f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Genesis::InstallBuiltinFunctionIds() { 2100c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate()); 21015f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ 21025f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org { \ 21035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org Handle<JSObject> holder = ResolveBuiltinIdHolder( \ 210446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context(), #holder_expr); \ 21055f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org BuiltinFunctionId id = k##name; \ 21065f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org InstallBuiltinFunctionId(holder, #fun_name, id); \ 2107720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 21085f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) 21095f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#undef INSTALL_BUILTIN_ID 2110720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 2111720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2112720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 2113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid Genesis::InstallExperimentalBuiltinFunctionIds() { 2114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HandleScope scope(isolate()); 2115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (FLAG_harmony_maths) { 2116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Handle<JSObject> holder = ResolveBuiltinIdHolder(native_context(), "Math"); 2117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org InstallBuiltinFunctionId(holder, "clz32", kMathClz32); 2118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2122c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// Do not forget to update macros.py with named constant 2123c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// of cache id. 2124c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#define JSFUNCTION_RESULT_CACHE_LIST(F) \ 212546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org F(16, native_context()->regexp_function()) 2126c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2127c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 21287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic FixedArray* CreateCache(int size, Handle<JSFunction> factory_function) { 2129160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Factory* factory = factory_function->GetIsolate()->factory(); 2130c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org // Caches are supposed to live for a long time, allocate in old space. 2131c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size; 2132ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org // Cannot use cast as object is not fully initialized yet. 2133ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>( 2134160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org *factory->NewFixedArrayWithHoles(array_size, TENURED)); 21357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org cache->set(JSFunctionResultCache::kFactoryIndex, *factory_function); 2136ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org cache->MakeZeroSize(); 2137ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org return cache; 2138c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org} 2139c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2140c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2141c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.orgvoid Genesis::InstallJSFunctionResultCaches() { 2142c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org const int kNumberOfCaches = 0 + 2143c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#define F(size, func) + 1 2144c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org JSFUNCTION_RESULT_CACHE_LIST(F) 2145c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#undef F 2146c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org ; 2147c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2148d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org Handle<FixedArray> caches = 2149d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org factory()->NewFixedArray(kNumberOfCaches, TENURED); 2150c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2151c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org int index = 0; 21524a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 21537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#define F(size, func) do { \ 21547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org FixedArray* cache = CreateCache((size), Handle<JSFunction>(func)); \ 21557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org caches->set(index++, cache); \ 21564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org } while (false) 21574a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 21584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org JSFUNCTION_RESULT_CACHE_LIST(F); 21594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 2160c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#undef F 2161c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 216246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context()->set_jsfunction_result_caches(*caches); 2163c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org} 2164c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2165c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 216665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgvoid Genesis::InitializeNormalizedMapCaches() { 2167c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate()); 2168c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org native_context()->set_normalized_map_cache(*cache); 216965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 217065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 217165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 217246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgbool Bootstrapper::InstallExtensions(Handle<Context> native_context, 21735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::ExtensionConfiguration* extensions) { 2174c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org BootstrapperActive active(this); 2175c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org SaveContext saved_context(isolate_); 2176c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org isolate_->set_context(*native_context); 21775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return Genesis::InstallExtensions(native_context, extensions) && 21785c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org Genesis::InstallSpecialObjects(native_context); 21795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 21805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 21815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 21825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgbool Genesis::InstallSpecialObjects(Handle<Context> native_context) { 218346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Isolate* isolate = native_context->GetIsolate(); 2184f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Factory* factory = isolate->factory(); 2185c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate); 218646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<JSGlobalObject> global(JSGlobalObject::cast( 218746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context->global_object())); 2188cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager // Expose the natives in global if a name for it is specified. 2189cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { 21904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> natives = 21914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory->InternalizeUtf8String(FLAG_expose_natives_as); 21928f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org RETURN_ON_EXCEPTION_VALUE( 21938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate, 2194fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 21958f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org global, natives, Handle<JSObject>(global->builtins()), DONT_ENUM), 21968f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org false); 2197cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager } 2198cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 21999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> Error = Object::GetProperty( 22009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org isolate, global, "Error").ToHandleChecked(); 220186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org if (Error->IsJSObject()) { 22024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> name = factory->InternalizeOneByteString( 22034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org STATIC_ASCII_VECTOR("stackTraceLimit")); 22044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<Smi> stack_trace_limit( 22054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Smi::FromInt(FLAG_stack_trace_limit), isolate); 22068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org RETURN_ON_EXCEPTION_VALUE( 22078f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate, 2208fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 22098f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Handle<JSObject>::cast(Error), name, stack_trace_limit, NONE), 22108f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org false); 22112abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org } 22122abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 2213cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager // Expose the debug global object in global if a name for it is specified. 2214cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) { 2215cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager // If loading fails we just bail out without installing the 2216cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager // debugger but without tanking the whole context. 22176a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org Debug* debug = isolate->debug(); 22185c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!debug->Load()) return true; 22196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org Handle<Context> debug_context = debug->debug_context(); 22205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Set the security token for the debugger context to the same as 222146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // the shell native context to allow calling between these (otherwise 22225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // exposing debug global object doesn't make much sense). 22236a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org debug_context->set_security_token(native_context->security_token()); 2224cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager Handle<String> debug_string = 22254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory->InternalizeUtf8String(FLAG_expose_debug_as); 22266a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org Handle<Object> global_proxy(debug_context->global_proxy(), isolate); 22278f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org RETURN_ON_EXCEPTION_VALUE( 22288f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org isolate, 2229fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 22308f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org global, debug_string, global_proxy, DONT_ENUM), 22318f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org false); 2232cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager } 22335c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return true; 2234cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager} 2235cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 2236e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 223727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgstatic uint32_t Hash(RegisteredExtension* extension) { 223827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org return v8::internal::ComputePointerHash(extension); 223927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org} 224027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 2241e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2242731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.orgGenesis::ExtensionStates::ExtensionStates() : map_(HashMap::PointersMatch, 8) {} 224327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 224427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgGenesis::ExtensionTraversalState Genesis::ExtensionStates::get_state( 224527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org RegisteredExtension* extension) { 224627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org i::HashMap::Entry* entry = map_.Lookup(extension, Hash(extension), false); 224727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org if (entry == NULL) { 224827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org return UNVISITED; 224927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org } 225027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org return static_cast<ExtensionTraversalState>( 225127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org reinterpret_cast<intptr_t>(entry->value)); 225227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org} 225327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 225427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgvoid Genesis::ExtensionStates::set_state(RegisteredExtension* extension, 225527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionTraversalState state) { 225627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org map_.Lookup(extension, Hash(extension), true)->value = 225727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org reinterpret_cast<void*>(static_cast<intptr_t>(state)); 225827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org} 2259cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 22605c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 226146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgbool Genesis::InstallExtensions(Handle<Context> native_context, 22625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::ExtensionConfiguration* extensions) { 2263c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Isolate* isolate = native_context->GetIsolate(); 226427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates extension_states; // All extensions have state UNVISITED. 22655c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return InstallAutoExtensions(isolate, &extension_states) && 22665c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (!FLAG_expose_free_buffer || 22675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallExtension(isolate, "v8/free-buffer", &extension_states)) && 22685c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (!FLAG_expose_gc || 22695c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallExtension(isolate, "v8/gc", &extension_states)) && 22705c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (!FLAG_expose_externalize_string || 22715c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallExtension(isolate, "v8/externalize", &extension_states)) && 22725c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (!FLAG_track_gc_object_stats || 22735c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallExtension(isolate, "v8/statistics", &extension_states)) && 22745c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (!FLAG_expose_trigger_failure || 22755c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallExtension(isolate, "v8/trigger-failure", &extension_states)) && 22765c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org InstallRequestedExtensions(isolate, extensions, &extension_states); 22775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org} 227843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22795c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 22805c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgbool Genesis::InstallAutoExtensions(Isolate* isolate, 22815c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ExtensionStates* extension_states) { 22825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension(); 22835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org it != NULL; 22845c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org it = it->next()) { 22855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (it->extension()->auto_enable() && 22865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !InstallExtension(isolate, it, extension_states)) { 22875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return false; 22885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 2289afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org } 22905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return true; 22915c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org} 22925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 229343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22945c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgbool Genesis::InstallRequestedExtensions(Isolate* isolate, 22955c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org v8::ExtensionConfiguration* extensions, 22965c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ExtensionStates* extension_states) { 229726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (const char** it = extensions->begin(); it != extensions->end(); ++it) { 22985c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!InstallExtension(isolate, *it, extension_states)) return false; 229943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 230043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 230143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 230243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 230343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 230443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Installs a named extension. This methods is unoptimized and does 230543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// not scale well if we want to support a large number of extensions. 2306c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgbool Genesis::InstallExtension(Isolate* isolate, 2307c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org const char* name, 230827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates* extension_states) { 23095c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension(); 23105c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org it != NULL; 23115c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org it = it->next()) { 23125c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (strcmp(name, it->extension()->name()) == 0) { 23135c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return InstallExtension(isolate, it, extension_states); 23145c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 231543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 23165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return Utils::ApiCheck(false, 23175c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org "v8::Context::New()", 23185c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org "Cannot find required extension"); 231943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 232043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 232143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2322c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgbool Genesis::InstallExtension(Isolate* isolate, 2323c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org v8::RegisteredExtension* current, 232427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ExtensionStates* extension_states) { 2325c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate); 232643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 232727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org if (extension_states->get_state(current) == INSTALLED) return true; 232843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The current node has already been visited so there must be a 232943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // cycle in the dependency graph; fail. 23304ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org if (!Utils::ApiCheck(extension_states->get_state(current) != VISITED, 23314ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "v8::Context::New()", 23324ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org "Circular extension dependency")) { 233343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 233443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 233527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ASSERT(extension_states->get_state(current) == UNVISITED); 233627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org extension_states->set_state(current, VISITED); 233743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Extension* extension = current->extension(); 233843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Install the extension's dependencies 233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < extension->dependency_count(); i++) { 2340c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org if (!InstallExtension(isolate, 2341c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org extension->dependencies()[i], 2342c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org extension_states)) { 234327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org return false; 2344c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 234543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2346b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // We do not expect this to throw an exception. Change this if it does. 2347255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org Handle<String> source_code = 2348255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org isolate->factory()->NewExternalStringFromAscii( 2349255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org extension->source()).ToHandleChecked(); 2350c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org bool result = CompileScriptCached(isolate, 2351c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org CStrVector(extension->name()), 2352c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org source_code, 2353c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org isolate->bootstrapper()->extensions_cache(), 2354c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org extension, 2355c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Handle<Context>(isolate->context()), 2356c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org false); 23577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org ASSERT(isolate->has_pending_exception() != result); 235843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!result) { 2359394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // We print out the name of the extension that fail to install. 2360394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // When an error is thrown during bootstrapping we automatically print 2361394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // the line number at which this happened to the console in the isolate 2362394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // error throwing functionality. 2363394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com OS::PrintError("Error installing extension '%s'.\n", 2364394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com current->extension()->name()); 23657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org isolate->clear_pending_exception(); 236643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 236727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org extension_states->set_state(current, INSTALLED); 236827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org isolate->NotifyExtensionInstalled(); 236943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 237143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 237243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgbool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { 2374c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate()); 23755c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { 23765c838251403b0be9a882540f1922577abba4c872ager@chromium.org Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); 23779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> function_object = Object::GetProperty( 23789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org isolate(), builtins, Builtins::GetName(id)).ToHandleChecked(); 23795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); 23805c838251403b0be9a882540f1922577abba4c872ager@chromium.org builtins->set_javascript_builtin(id, *function); 23814954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { 2382394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return false; 2383394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 2384400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org builtins->set_javascript_builtin_code(id, function->shared()->code()); 23855c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 23865c838251403b0be9a882540f1922577abba4c872ager@chromium.org return true; 23875c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 23885c838251403b0be9a882540f1922577abba4c872ager@chromium.org 23895c838251403b0be9a882540f1922577abba4c872ager@chromium.org 23905a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgbool Genesis::ConfigureGlobalObjects( 23915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::Handle<v8::ObjectTemplate> global_proxy_template) { 23925a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<JSObject> global_proxy( 239346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org JSObject::cast(native_context()->global_proxy())); 239446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Handle<JSObject> inner_global( 239546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org JSObject::cast(native_context()->global_object())); 23965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 23975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (!global_proxy_template.IsEmpty()) { 23985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Configure the global proxy object. 23995a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<ObjectTemplateInfo> proxy_data = 24005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::Utils::OpenHandle(*global_proxy_template); 24015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (!ConfigureApiObject(global_proxy, proxy_data)) return false; 24025a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Configure the inner global object. 24045a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<FunctionTemplateInfo> proxy_constructor( 24055a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org FunctionTemplateInfo::cast(proxy_data->constructor())); 24065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (!proxy_constructor->prototype_template()->IsUndefined()) { 24075a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<ObjectTemplateInfo> inner_data( 24085a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org ObjectTemplateInfo::cast(proxy_constructor->prototype_template())); 24095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!ConfigureApiObject(inner_global, inner_data)) return false; 241043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 241143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 24125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SetObjectPrototype(global_proxy, inner_global); 2414906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2415906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org native_context()->set_initial_array_prototype( 2416906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org JSArray::cast(native_context()->array_function()->prototype())); 2417906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 24185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return true; 24195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 24205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgbool Genesis::ConfigureApiObject(Handle<JSObject> object, 24235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<ObjectTemplateInfo> object_template) { 24245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org ASSERT(!object_template.is_null()); 24259af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ASSERT(FunctionTemplateInfo::cast(object_template->constructor()) 24269af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ->IsTemplateFor(object->map()));; 24275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MaybeHandle<JSObject> maybe_obj = 24292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Execution::InstantiateObject(object_template); 24302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<JSObject> obj; 24312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (!maybe_obj.ToHandle(&obj)) { 2432160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org ASSERT(isolate()->has_pending_exception()); 2433160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org isolate()->clear_pending_exception(); 24345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return false; 24355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 24365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org TransferObject(obj, object); 243743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 243843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 243943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 244043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 244143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Genesis::TransferNamedProperties(Handle<JSObject> from, 244243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSObject> to) { 244343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (from->HasFastProperties()) { 244443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<DescriptorArray> descs = 244543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<DescriptorArray>(from->map()->instance_descriptors()); 244657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) { 2447ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com PropertyDetails details = descs->GetDetails(i); 244843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (details.type()) { 244943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case FIELD: { 2450c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope inner(isolate()); 2451750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> key = Handle<Name>(descs->GetKey(i)); 2452e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org FieldIndex index = FieldIndex::ForDescriptor(from->map(), i); 245357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org ASSERT(!descs->GetDetails(i).representation().IsDouble()); 245457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index), 245509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate()); 2456fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 24578f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org to, key, value, details.attributes()).Check(); 245843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 245943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2460fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org case CONSTANT: { 2461c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope inner(isolate()); 2462750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<Name> key = Handle<Name>(descs->GetKey(i)); 2463fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org Handle<Object> constant(descs->GetConstant(i), isolate()); 2464fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 24658f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org to, key, constant, details.attributes()).Check(); 246643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 246743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 246843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case CALLBACKS: { 2469394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LookupResult result(isolate()); 24703484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<Name> key(Name::cast(descs->GetKey(i)), isolate()); 2471fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org to->LookupOwn(key, &result); 247243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the property is already there we skip it 2473753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org if (result.IsFound()) continue; 2474c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope inner(isolate()); 24755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(!to->HasFastProperties()); 24765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Add to dictionary. 247709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate()); 247857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PropertyDetails d = PropertyDetails( 247957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org details.attributes(), CALLBACKS, i + 1); 2480f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com JSObject::SetNormalizedProperty(to, key, callbacks, d); 248143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 248243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 248343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case NORMAL: 248443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Do not occur since the from object has fast properties. 2485c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org case HANDLER: 248643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case INTERCEPTOR: 24877a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org case NONEXISTENT: 2488c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // No element in instance descriptors have proxy or interceptor type. 248943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 249043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 249143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 249243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 249343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 2494750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<NameDictionary> properties = 2495750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Handle<NameDictionary>(from->property_dictionary()); 249643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int capacity = properties->Capacity(); 249743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < capacity; i++) { 249843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* raw_key(properties->KeyAt(i)); 249943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (properties->IsKey(raw_key)) { 2500750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ASSERT(raw_key->IsName()); 250143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the property is already there we skip it. 2502394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LookupResult result(isolate()); 25033484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<Name> key(Name::cast(raw_key)); 2504fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org to->LookupOwn(key, &result); 2505753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org if (result.IsFound()) continue; 250643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Set the property. 250709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> value = Handle<Object>(properties->ValueAt(i), 250809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate()); 250941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ASSERT(!value->IsCell()); 2510b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (value->IsPropertyCell()) { 2511b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org value = Handle<Object>(PropertyCell::cast(*value)->value(), 251209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org isolate()); 25132abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org } 251443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PropertyDetails details = properties->DetailsAt(i); 2515fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org JSObject::SetOwnPropertyIgnoreAttributes( 25168f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org to, key, value, details.attributes()).Check(); 251743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 251843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 251943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 252043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 252143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 252243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 252343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Genesis::TransferIndexedProperties(Handle<JSObject> from, 252443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<JSObject> to) { 252543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Cloning the elements array is sufficient. 252643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<FixedArray> from_elements = 252743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<FixedArray>(FixedArray::cast(from->elements())); 2528d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org Handle<FixedArray> to_elements = factory()->CopyFixedArray(from_elements); 252943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen to->set_elements(*to_elements); 253043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 253143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 253243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 253343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { 2534c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope outer(isolate()); 253543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(!from->IsJSArray()); 253743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(!to->IsJSArray()); 253843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 253943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TransferNamedProperties(from, to); 254043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TransferIndexedProperties(from, to); 254143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 254243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Transfer the prototype (new map is needed). 254343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<Map> old_to_map = Handle<Map>(to->map()); 2544ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Handle<Map> new_to_map = Map::Copy(old_to_map); 254543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen new_to_map->set_prototype(from->map()->prototype()); 254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen to->set_map(*new_to_map); 254743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 254843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 254943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 255043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Genesis::MakeFunctionInstancePrototypeWritable() { 2551ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The maps with writable prototype are created in CreateEmptyFunction 2552ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // and CreateStrictModeFunctionMaps respectively. Initially the maps are 2553ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // created with read-only prototype for JS builtins processing. 2554486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ASSERT(!sloppy_function_map_writable_prototype_.is_null()); 2555486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ASSERT(!strict_function_map_writable_prototype_.is_null()); 2556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Replace function instance maps to make prototype writable. 2558486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_sloppy_function_map( 2559486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org *sloppy_function_map_writable_prototype_); 2560486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org native_context()->set_strict_function_map( 2561486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org *strict_function_map_writable_prototype_); 256243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 256343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 256443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 256509cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.orgclass NoTrackDoubleFieldsForSerializerScope { 256609cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org public: 2567865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org explicit NoTrackDoubleFieldsForSerializerScope(Isolate* isolate) 2568fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org : flag_(FLAG_track_double_fields) { 2569fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (isolate->serializer_enabled()) { 257009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org // Disable tracking double fields because heap numbers treated as 257109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org // immutable by the serializer. 257209cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org FLAG_track_double_fields = false; 257309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org } 257409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org } 2575a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 257609cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org ~NoTrackDoubleFieldsForSerializerScope() { 2577fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org FLAG_track_double_fields = flag_; 257809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org } 257909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org 258009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org private: 258109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org bool flag_; 258209cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org}; 258309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org 258409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org 2585160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgGenesis::Genesis(Isolate* isolate, 2586160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<Object> global_object, 258743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen v8::Handle<v8::ObjectTemplate> global_template, 2588c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org v8::ExtensionConfiguration* extensions) 2589c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org : isolate_(isolate), 2590c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org active_(isolate->bootstrapper()) { 2591865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org NoTrackDoubleFieldsForSerializerScope disable_scope(isolate); 259268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org result_ = Handle<Context>::null(); 2593e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org // If V8 cannot be initialized, just return. 2594e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org if (!V8::Initialize(NULL)) return; 259543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 259643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Before creating the roots we must save the context and restore it 259743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // on all function exits. 2598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SaveContext saved_context(isolate); 25995d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 26007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // During genesis, the boilerplate for stack overflow won't work until the 26017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // environment has been at least partially initialized. Add a stack check 26027d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // before entering JS code to catch overflow early. 2603c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org StackLimitCheck check(isolate); 26047d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org if (check.HasOverflowed()) return; 26057d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 26061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // We can only de-serialize a context if the isolate was initialized from 26071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // a snapshot. Otherwise we have to build the context from scratch. 26081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (isolate->initialized_from_snapshot()) { 26093d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org native_context_ = Snapshot::NewContextFromSnapshot(isolate); 26101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 26111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org native_context_ = Handle<Context>(); 26121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 26131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 26147bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org if (!native_context().is_null()) { 26157bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org AddToWeakNativeContextList(*native_context()); 26167bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org isolate->set_context(*native_context()); 2617ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->counters()->contexts_created_by_snapshot()->Increment(); 26185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject> inner_global; 26195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSGlobalProxy> global_proxy = 26205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CreateNewGlobals(global_template, 26215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org global_object, 26225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org &inner_global); 26235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 26245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org HookUpGlobalProxy(inner_global, global_proxy); 26255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org HookUpInnerGlobal(inner_global); 26269ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org native_context()->builtins()->set_global_receiver( 26279ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org native_context()->global_proxy()); 26285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 26295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!ConfigureGlobalObjects(global_template)) return; 26305d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 26315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // We get here if there was no context snapshot. 26325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CreateRoots(); 2633160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); 2634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CreateStrictModeFunctionMaps(empty_function); 26355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<GlobalObject> inner_global; 26365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<JSGlobalProxy> global_proxy = 26375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CreateNewGlobals(global_template, global_object, &inner_global); 26385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org HookUpGlobalProxy(inner_global, global_proxy); 2639ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org InitializeGlobal(inner_global, empty_function); 2640c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org InstallJSFunctionResultCaches(); 264165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org InitializeNormalizedMapCaches(); 2642dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org if (!InstallNatives()) return; 26435d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 26445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org MakeFunctionInstancePrototypeWritable(); 26455d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 26465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (!ConfigureGlobalObjects(global_template)) return; 2647ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->counters()->contexts_created_from_scratch()->Increment(); 26485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 2649cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager 26507c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Initialize experimental globals and install experimental natives. 26517c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org InitializeExperimentalGlobal(); 2652160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (!InstallExperimentalNatives()) return; 2653160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2654f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // We can't (de-)serialize typed arrays currently, but we are lucky: The state 2655f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // of the random number generator needs no initialization during snapshot 2656f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // creation time and we don't need trigonometric functions then. 2657fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (!isolate->serializer_enabled()) { 2658f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // Initially seed the per-context random number generator using the 2659f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org // per-isolate random number generator. 2660f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const int num_elems = 2; 2661f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const int num_bytes = num_elems * sizeof(uint32_t); 2662f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org uint32_t* state = reinterpret_cast<uint32_t*>(malloc(num_bytes)); 2663f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 2664f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org do { 2665f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org isolate->random_number_generator()->NextBytes(state, num_bytes); 2666f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } while (state[0] == 0 || state[1] == 0); 2667f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 26689f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New( 26699f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org reinterpret_cast<v8::Isolate*>(isolate), state, num_bytes); 2670f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Utils::OpenHandle(*buffer)->set_should_be_freed(true); 2671f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Uint32Array> ta = v8::Uint32Array::New(buffer, 0, num_elems); 267290dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org Handle<JSBuiltinsObject> builtins(native_context()->builtins()); 26738f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty(builtins, 26748f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 26758f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("rngstate")), 26768f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Utils::OpenHandle(*ta), 26778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org NONE).Assert(); 2678f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 267990dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org // Initialize trigonometric lookup tables and constants. 268090dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org const int table_num_bytes = TrigonometricLookupTable::table_num_bytes(); 268190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org v8::Local<v8::ArrayBuffer> sin_buffer = v8::ArrayBuffer::New( 26829f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org reinterpret_cast<v8::Isolate*>(isolate), 268390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org TrigonometricLookupTable::sin_table(), table_num_bytes); 268490dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org v8::Local<v8::ArrayBuffer> cos_buffer = v8::ArrayBuffer::New( 26859f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org reinterpret_cast<v8::Isolate*>(isolate), 268690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org TrigonometricLookupTable::cos_x_interval_table(), table_num_bytes); 268790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org v8::Local<v8::Float64Array> sin_table = v8::Float64Array::New( 268890dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org sin_buffer, 0, TrigonometricLookupTable::table_size()); 268990dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org v8::Local<v8::Float64Array> cos_table = v8::Float64Array::New( 269090dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org cos_buffer, 0, TrigonometricLookupTable::table_size()); 269190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 26928f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty(builtins, 26938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 26948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("kSinTable")), 26958f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Utils::OpenHandle(*sin_table), 26968f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org NONE).Assert(); 26978f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty( 26988f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org builtins, 26998f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 27008f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("kCosXIntervalTable")), 27018f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Utils::OpenHandle(*cos_table), 27028f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org NONE).Assert(); 27038f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty( 27048f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org builtins, 27058f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 27068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("kSamples")), 27078f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->NewHeapNumber( 27088f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org TrigonometricLookupTable::samples()), 27098f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org NONE).Assert(); 27108f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org Runtime::ForceSetObjectProperty( 27118f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org builtins, 27128f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->InternalizeOneByteString( 27138f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org STATIC_ASCII_VECTOR("kIndexConvert")), 27148f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org factory()->NewHeapNumber( 27158f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org TrigonometricLookupTable::samples_over_pi_half()), 27168f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org NONE).Assert(); 271790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org } 271890dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org 27197bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org result_ = native_context(); 272043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 272143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2722ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2723ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Support for thread preemption. 2724ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2725ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Reserve space for statics needing saving and restoring. 2726ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgint Bootstrapper::ArchiveSpacePerThread() { 2727ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return sizeof(NestingCounterType); 2728ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 2729ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2730ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2731fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org// Archive statics that are thread-local. 2732ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgchar* Bootstrapper::ArchiveState(char* to) { 2733ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *reinterpret_cast<NestingCounterType*>(to) = nesting_; 2734ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nesting_ = 0; 2735ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return to + sizeof(NestingCounterType); 2736ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 2737ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2738ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2739fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org// Restore statics that are thread-local. 2740ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgchar* Bootstrapper::RestoreState(char* from) { 2741ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nesting_ = *reinterpret_cast<NestingCounterType*>(from); 2742ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return from + sizeof(NestingCounterType); 2743ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 2744ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2745ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2746c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org// Called when the top-level V8 mutex is destroyed. 2747c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid Bootstrapper::FreeThreadResources() { 2748ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!IsActive()); 2749ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 2750ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 275143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 2752