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