4d7ce52a127d647a04d004326cf8e296eb04b4ce
[platform/framework/web/crosswalk.git] / src / v8 / src / bootstrapper.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/bootstrapper.h"
6
7 #include "src/accessors.h"
8 #include "src/isolate-inl.h"
9 #include "src/natives.h"
10 #include "src/snapshot.h"
11 #include "src/trig-table.h"
12 #include "src/extensions/externalize-string-extension.h"
13 #include "src/extensions/free-buffer-extension.h"
14 #include "src/extensions/gc-extension.h"
15 #include "src/extensions/statistics-extension.h"
16 #include "src/extensions/trigger-failure-extension.h"
17 #include "src/code-stubs.h"
18
19 namespace v8 {
20 namespace internal {
21
22 NativesExternalStringResource::NativesExternalStringResource(
23     Bootstrapper* bootstrapper,
24     const char* source,
25     size_t length)
26     : data_(source), length_(length) {
27   if (bootstrapper->delete_these_non_arrays_on_tear_down_ == NULL) {
28     bootstrapper->delete_these_non_arrays_on_tear_down_ = new List<char*>(2);
29   }
30   // The resources are small objects and we only make a fixed number of
31   // them, but let's clean them up on exit for neatness.
32   bootstrapper->delete_these_non_arrays_on_tear_down_->
33       Add(reinterpret_cast<char*>(this));
34 }
35
36
37 Bootstrapper::Bootstrapper(Isolate* isolate)
38     : isolate_(isolate),
39       nesting_(0),
40       extensions_cache_(Script::TYPE_EXTENSION),
41       delete_these_non_arrays_on_tear_down_(NULL),
42       delete_these_arrays_on_tear_down_(NULL) {
43 }
44
45
46 Handle<String> Bootstrapper::NativesSourceLookup(int index) {
47   ASSERT(0 <= index && index < Natives::GetBuiltinsCount());
48   Heap* heap = isolate_->heap();
49   if (heap->natives_source_cache()->get(index)->IsUndefined()) {
50     // We can use external strings for the natives.
51     Vector<const char> source = Natives::GetRawScriptSource(index);
52     NativesExternalStringResource* resource =
53         new NativesExternalStringResource(this,
54                                           source.start(),
55                                           source.length());
56     // We do not expect this to throw an exception. Change this if it does.
57     Handle<String> source_code =
58         isolate_->factory()->NewExternalStringFromAscii(
59             resource).ToHandleChecked();
60     heap->natives_source_cache()->set(index, *source_code);
61   }
62   Handle<Object> cached_source(heap->natives_source_cache()->get(index),
63                                isolate_);
64   return Handle<String>::cast(cached_source);
65 }
66
67
68 void Bootstrapper::Initialize(bool create_heap_objects) {
69   extensions_cache_.Initialize(isolate_, create_heap_objects);
70 }
71
72
73 static const char* GCFunctionName() {
74   bool flag_given = FLAG_expose_gc_as != NULL && strlen(FLAG_expose_gc_as) != 0;
75   return flag_given ? FLAG_expose_gc_as : "gc";
76 }
77
78
79 v8::Extension* Bootstrapper::free_buffer_extension_ = NULL;
80 v8::Extension* Bootstrapper::gc_extension_ = NULL;
81 v8::Extension* Bootstrapper::externalize_string_extension_ = NULL;
82 v8::Extension* Bootstrapper::statistics_extension_ = NULL;
83 v8::Extension* Bootstrapper::trigger_failure_extension_ = NULL;
84
85
86 void Bootstrapper::InitializeOncePerProcess() {
87   free_buffer_extension_ = new FreeBufferExtension;
88   v8::RegisterExtension(free_buffer_extension_);
89   gc_extension_ = new GCExtension(GCFunctionName());
90   v8::RegisterExtension(gc_extension_);
91   externalize_string_extension_ = new ExternalizeStringExtension;
92   v8::RegisterExtension(externalize_string_extension_);
93   statistics_extension_ = new StatisticsExtension;
94   v8::RegisterExtension(statistics_extension_);
95   trigger_failure_extension_ = new TriggerFailureExtension;
96   v8::RegisterExtension(trigger_failure_extension_);
97 }
98
99
100 void Bootstrapper::TearDownExtensions() {
101   delete free_buffer_extension_;
102   delete gc_extension_;
103   delete externalize_string_extension_;
104   delete statistics_extension_;
105   delete trigger_failure_extension_;
106 }
107
108
109 char* Bootstrapper::AllocateAutoDeletedArray(int bytes) {
110   char* memory = new char[bytes];
111   if (memory != NULL) {
112     if (delete_these_arrays_on_tear_down_ == NULL) {
113       delete_these_arrays_on_tear_down_ = new List<char*>(2);
114     }
115     delete_these_arrays_on_tear_down_->Add(memory);
116   }
117   return memory;
118 }
119
120
121 void Bootstrapper::TearDown() {
122   if (delete_these_non_arrays_on_tear_down_ != NULL) {
123     int len = delete_these_non_arrays_on_tear_down_->length();
124     ASSERT(len < 24);  // Don't use this mechanism for unbounded allocations.
125     for (int i = 0; i < len; i++) {
126       delete delete_these_non_arrays_on_tear_down_->at(i);
127       delete_these_non_arrays_on_tear_down_->at(i) = NULL;
128     }
129     delete delete_these_non_arrays_on_tear_down_;
130     delete_these_non_arrays_on_tear_down_ = NULL;
131   }
132
133   if (delete_these_arrays_on_tear_down_ != NULL) {
134     int len = delete_these_arrays_on_tear_down_->length();
135     ASSERT(len < 1000);  // Don't use this mechanism for unbounded allocations.
136     for (int i = 0; i < len; i++) {
137       delete[] delete_these_arrays_on_tear_down_->at(i);
138       delete_these_arrays_on_tear_down_->at(i) = NULL;
139     }
140     delete delete_these_arrays_on_tear_down_;
141     delete_these_arrays_on_tear_down_ = NULL;
142   }
143
144   extensions_cache_.Initialize(isolate_, false);  // Yes, symmetrical
145 }
146
147
148 class Genesis BASE_EMBEDDED {
149  public:
150   Genesis(Isolate* isolate,
151           Handle<Object> global_object,
152           v8::Handle<v8::ObjectTemplate> global_template,
153           v8::ExtensionConfiguration* extensions);
154   ~Genesis() { }
155
156   Isolate* isolate() const { return isolate_; }
157   Factory* factory() const { return isolate_->factory(); }
158   Heap* heap() const { return isolate_->heap(); }
159
160   Handle<Context> result() { return result_; }
161
162  private:
163   Handle<Context> native_context() { return native_context_; }
164
165   // Creates some basic objects. Used for creating a context from scratch.
166   void CreateRoots();
167   // Creates the empty function.  Used for creating a context from scratch.
168   Handle<JSFunction> CreateEmptyFunction(Isolate* isolate);
169   // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3
170   Handle<JSFunction> GetStrictPoisonFunction();
171   // Poison for sloppy generator function arguments/callee.
172   Handle<JSFunction> GetGeneratorPoisonFunction();
173
174   void CreateStrictModeFunctionMaps(Handle<JSFunction> empty);
175
176   // Make the "arguments" and "caller" properties throw a TypeError on access.
177   void PoisonArgumentsAndCaller(Handle<Map> map);
178
179   // Creates the global objects using the global and the template passed in
180   // through the API.  We call this regardless of whether we are building a
181   // context from scratch or using a deserialized one from the partial snapshot
182   // but in the latter case we don't use the objects it produces directly, as
183   // we have to used the deserialized ones that are linked together with the
184   // rest of the context snapshot.
185   Handle<JSGlobalProxy> CreateNewGlobals(
186       v8::Handle<v8::ObjectTemplate> global_template,
187       Handle<Object> global_object,
188       Handle<GlobalObject>* global_proxy_out);
189   // Hooks the given global proxy into the context.  If the context was created
190   // by deserialization then this will unhook the global proxy that was
191   // deserialized, leaving the GC to pick it up.
192   void HookUpGlobalProxy(Handle<GlobalObject> inner_global,
193                          Handle<JSGlobalProxy> global_proxy);
194   // Similarly, we want to use the inner global that has been created by the
195   // templates passed through the API.  The inner global from the snapshot is
196   // detached from the other objects in the snapshot.
197   void HookUpInnerGlobal(Handle<GlobalObject> inner_global);
198   // New context initialization.  Used for creating a context from scratch.
199   void InitializeGlobal(Handle<GlobalObject> inner_global,
200                         Handle<JSFunction> empty_function);
201   void InitializeExperimentalGlobal();
202   // Installs the contents of the native .js files on the global objects.
203   // Used for creating a context from scratch.
204   void InstallNativeFunctions();
205   void InstallExperimentalBuiltinFunctionIds();
206   void InstallExperimentalNativeFunctions();
207   Handle<JSFunction> InstallInternalArray(Handle<JSBuiltinsObject> builtins,
208                                           const char* name,
209                                           ElementsKind elements_kind);
210   bool InstallNatives();
211
212   void InstallTypedArray(
213       const char* name,
214       ElementsKind elements_kind,
215       Handle<JSFunction>* fun,
216       Handle<Map>* external_map);
217   bool InstallExperimentalNatives();
218   void InstallBuiltinFunctionIds();
219   void InstallJSFunctionResultCaches();
220   void InitializeNormalizedMapCaches();
221
222   enum ExtensionTraversalState {
223     UNVISITED, VISITED, INSTALLED
224   };
225
226   class ExtensionStates {
227    public:
228     ExtensionStates();
229     ExtensionTraversalState get_state(RegisteredExtension* extension);
230     void set_state(RegisteredExtension* extension,
231                    ExtensionTraversalState state);
232    private:
233     HashMap map_;
234     DISALLOW_COPY_AND_ASSIGN(ExtensionStates);
235   };
236
237   // Used both for deserialized and from-scratch contexts to add the extensions
238   // provided.
239   static bool InstallExtensions(Handle<Context> native_context,
240                                 v8::ExtensionConfiguration* extensions);
241   static bool InstallAutoExtensions(Isolate* isolate,
242                                     ExtensionStates* extension_states);
243   static bool InstallRequestedExtensions(Isolate* isolate,
244                                          v8::ExtensionConfiguration* extensions,
245                                          ExtensionStates* extension_states);
246   static bool InstallExtension(Isolate* isolate,
247                                const char* name,
248                                ExtensionStates* extension_states);
249   static bool InstallExtension(Isolate* isolate,
250                                v8::RegisteredExtension* current,
251                                ExtensionStates* extension_states);
252   static bool InstallSpecialObjects(Handle<Context> native_context);
253   bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins);
254   bool ConfigureApiObject(Handle<JSObject> object,
255                           Handle<ObjectTemplateInfo> object_template);
256   bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template);
257
258   // Migrates all properties from the 'from' object to the 'to'
259   // object and overrides the prototype in 'to' with the one from
260   // 'from'.
261   void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
262   void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
263   void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
264
265   enum FunctionMode {
266     // With prototype.
267     FUNCTION_WITH_WRITEABLE_PROTOTYPE,
268     FUNCTION_WITH_READONLY_PROTOTYPE,
269     // Without prototype.
270     FUNCTION_WITHOUT_PROTOTYPE,
271     BOUND_FUNCTION
272   };
273
274   static bool IsFunctionModeWithPrototype(FunctionMode function_mode) {
275     return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
276             function_mode == FUNCTION_WITH_READONLY_PROTOTYPE);
277   }
278
279   Handle<Map> CreateFunctionMap(FunctionMode function_mode);
280
281   void SetFunctionInstanceDescriptor(Handle<Map> map,
282                                      FunctionMode function_mode);
283   void MakeFunctionInstancePrototypeWritable();
284
285   Handle<Map> CreateStrictFunctionMap(
286       FunctionMode function_mode,
287       Handle<JSFunction> empty_function);
288
289   void SetStrictFunctionInstanceDescriptor(Handle<Map> map,
290                                            FunctionMode function_mode);
291
292   static bool CompileBuiltin(Isolate* isolate, int index);
293   static bool CompileExperimentalBuiltin(Isolate* isolate, int index);
294   static bool CompileNative(Isolate* isolate,
295                             Vector<const char> name,
296                             Handle<String> source);
297   static bool CompileScriptCached(Isolate* isolate,
298                                   Vector<const char> name,
299                                   Handle<String> source,
300                                   SourceCodeCache* cache,
301                                   v8::Extension* extension,
302                                   Handle<Context> top_context,
303                                   bool use_runtime_context);
304
305   Isolate* isolate_;
306   Handle<Context> result_;
307   Handle<Context> native_context_;
308
309   // Function maps. Function maps are created initially with a read only
310   // prototype for the processing of JS builtins. Later the function maps are
311   // replaced in order to make prototype writable. These are the final, writable
312   // prototype, maps.
313   Handle<Map> sloppy_function_map_writable_prototype_;
314   Handle<Map> strict_function_map_writable_prototype_;
315   Handle<JSFunction> strict_poison_function;
316   Handle<JSFunction> generator_poison_function;
317
318   BootstrapperActive active_;
319   friend class Bootstrapper;
320 };
321
322
323 void Bootstrapper::Iterate(ObjectVisitor* v) {
324   extensions_cache_.Iterate(v);
325   v->Synchronize(VisitorSynchronization::kExtensions);
326 }
327
328
329 Handle<Context> Bootstrapper::CreateEnvironment(
330     Handle<Object> global_object,
331     v8::Handle<v8::ObjectTemplate> global_template,
332     v8::ExtensionConfiguration* extensions) {
333   HandleScope scope(isolate_);
334   Genesis genesis(isolate_, global_object, global_template, extensions);
335   Handle<Context> env = genesis.result();
336   if (env.is_null() || !InstallExtensions(env, extensions)) {
337     return Handle<Context>();
338   }
339   return scope.CloseAndEscape(env);
340 }
341
342
343 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
344   // object.__proto__ = proto;
345   Handle<Map> old_to_map = Handle<Map>(object->map());
346   Handle<Map> new_to_map = Map::Copy(old_to_map);
347   new_to_map->set_prototype(*proto);
348   object->set_map(*new_to_map);
349 }
350
351
352 void Bootstrapper::DetachGlobal(Handle<Context> env) {
353   Factory* factory = env->GetIsolate()->factory();
354   Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy()));
355   global_proxy->set_native_context(*factory->null_value());
356   SetObjectPrototype(global_proxy, factory->null_value());
357 }
358
359
360 static Handle<JSFunction> InstallFunction(Handle<JSObject> target,
361                                           const char* name,
362                                           InstanceType type,
363                                           int instance_size,
364                                           MaybeHandle<JSObject> maybe_prototype,
365                                           Builtins::Name call) {
366   Isolate* isolate = target->GetIsolate();
367   Factory* factory = isolate->factory();
368   Handle<String> internalized_name = factory->InternalizeUtf8String(name);
369   Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call));
370   Handle<JSObject> prototype;
371   Handle<JSFunction> function = maybe_prototype.ToHandle(&prototype)
372       ? factory->NewFunction(internalized_name, call_code, prototype,
373                              type, instance_size)
374       : factory->NewFunctionWithoutPrototype(internalized_name, call_code);
375   PropertyAttributes attributes;
376   if (target->IsJSBuiltinsObject()) {
377     attributes =
378         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
379   } else {
380     attributes = DONT_ENUM;
381   }
382   JSObject::SetOwnPropertyIgnoreAttributes(
383       target, internalized_name, function, attributes).Check();
384   if (target->IsJSGlobalObject()) {
385     function->shared()->set_instance_class_name(*internalized_name);
386   }
387   function->shared()->set_native(true);
388   return function;
389 }
390
391
392 void Genesis::SetFunctionInstanceDescriptor(
393     Handle<Map> map, FunctionMode function_mode) {
394   int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4;
395   Map::EnsureDescriptorSlack(map, size);
396
397   PropertyAttributes attribs = static_cast<PropertyAttributes>(
398       DONT_ENUM | DONT_DELETE | READ_ONLY);
399
400   Handle<AccessorInfo> length =
401       Accessors::FunctionLengthInfo(isolate(), attribs);
402   {  // Add length.
403     CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())),
404                           length, attribs);
405     map->AppendDescriptor(&d);
406   }
407   Handle<AccessorInfo> name =
408       Accessors::FunctionNameInfo(isolate(), attribs);
409   {  // Add name.
410     CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())),
411                           name, attribs);
412     map->AppendDescriptor(&d);
413   }
414   Handle<AccessorInfo> args =
415       Accessors::FunctionArgumentsInfo(isolate(), attribs);
416   {  // Add arguments.
417     CallbacksDescriptor d(Handle<Name>(Name::cast(args->name())),
418                           args, attribs);
419     map->AppendDescriptor(&d);
420   }
421   Handle<AccessorInfo> caller =
422       Accessors::FunctionCallerInfo(isolate(), attribs);
423   {  // Add caller.
424     CallbacksDescriptor d(Handle<Name>(Name::cast(caller->name())),
425                           caller, attribs);
426     map->AppendDescriptor(&d);
427   }
428   if (IsFunctionModeWithPrototype(function_mode)) {
429     if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) {
430       attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY);
431     }
432     Handle<AccessorInfo> prototype =
433         Accessors::FunctionPrototypeInfo(isolate(), attribs);
434     CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())),
435                           prototype, attribs);
436     map->AppendDescriptor(&d);
437   }
438 }
439
440
441 Handle<Map> Genesis::CreateFunctionMap(FunctionMode function_mode) {
442   Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
443   SetFunctionInstanceDescriptor(map, function_mode);
444   map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
445   return map;
446 }
447
448
449 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
450   // Allocate the map for function instances. Maps are allocated first and their
451   // prototypes patched later, once empty function is created.
452
453   // Functions with this map will not have a 'prototype' property, and
454   // can not be used as constructors.
455   Handle<Map> function_without_prototype_map =
456       CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
457   native_context()->set_sloppy_function_without_prototype_map(
458       *function_without_prototype_map);
459
460   // Allocate the function map. This map is temporary, used only for processing
461   // of builtins.
462   // Later the map is replaced with writable prototype map, allocated below.
463   Handle<Map> function_map =
464       CreateFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE);
465   native_context()->set_sloppy_function_map(*function_map);
466   native_context()->set_sloppy_function_with_readonly_prototype_map(
467       *function_map);
468
469   // The final map for functions. Writeable prototype.
470   // This map is installed in MakeFunctionInstancePrototypeWritable.
471   sloppy_function_map_writable_prototype_ =
472       CreateFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE);
473
474   Factory* factory = isolate->factory();
475
476   Handle<String> object_name = factory->Object_string();
477
478   {  // --- O b j e c t ---
479     Handle<JSFunction> object_fun = factory->NewFunction(object_name);
480     Handle<Map> object_function_map =
481         factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
482     object_fun->set_initial_map(*object_function_map);
483     object_function_map->set_constructor(*object_fun);
484     object_function_map->set_unused_property_fields(
485         JSObject::kInitialGlobalObjectUnusedPropertiesCount);
486
487     native_context()->set_object_function(*object_fun);
488
489     // Allocate a new prototype for the object function.
490     Handle<JSObject> prototype = factory->NewJSObject(
491         isolate->object_function(),
492         TENURED);
493
494     native_context()->set_initial_object_prototype(*prototype);
495     // For bootstrapping set the array prototype to be the same as the object
496     // prototype, otherwise the missing initial_array_prototype will cause
497     // assertions during startup.
498     native_context()->set_initial_array_prototype(*prototype);
499     Accessors::FunctionSetPrototype(object_fun, prototype);
500   }
501
502   // Allocate the empty function as the prototype for function ECMAScript
503   // 262 15.3.4.
504   Handle<String> empty_string =
505       factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty"));
506   Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction));
507   Handle<JSFunction> empty_function = factory->NewFunctionWithoutPrototype(
508       empty_string, code);
509
510   // --- E m p t y ---
511   Handle<String> source = factory->NewStringFromStaticAscii("() {}");
512   Handle<Script> script = factory->NewScript(source);
513   script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
514   empty_function->shared()->set_script(*script);
515   empty_function->shared()->set_start_position(0);
516   empty_function->shared()->set_end_position(source->length());
517   empty_function->shared()->DontAdaptArguments();
518
519   // Set prototypes for the function maps.
520   native_context()->sloppy_function_map()->set_prototype(*empty_function);
521   native_context()->sloppy_function_without_prototype_map()->
522       set_prototype(*empty_function);
523   sloppy_function_map_writable_prototype_->set_prototype(*empty_function);
524
525   // Allocate the function map first and then patch the prototype later
526   Handle<Map> empty_function_map =
527       CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE);
528   empty_function_map->set_prototype(
529       native_context()->object_function()->prototype());
530   empty_function->set_map(*empty_function_map);
531   return empty_function;
532 }
533
534
535 void Genesis::SetStrictFunctionInstanceDescriptor(
536     Handle<Map> map, FunctionMode function_mode) {
537   int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4;
538   Map::EnsureDescriptorSlack(map, size);
539
540   Handle<AccessorPair> arguments(factory()->NewAccessorPair());
541   Handle<AccessorPair> caller(factory()->NewAccessorPair());
542   PropertyAttributes rw_attribs =
543       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
544   PropertyAttributes ro_attribs =
545       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
546
547   // Add length.
548   if (function_mode == BOUND_FUNCTION) {
549     Handle<String> length_string = isolate()->factory()->length_string();
550     FieldDescriptor d(length_string, 0, ro_attribs, Representation::Tagged());
551     map->AppendDescriptor(&d);
552   } else {
553     ASSERT(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
554            function_mode == FUNCTION_WITH_READONLY_PROTOTYPE ||
555            function_mode == FUNCTION_WITHOUT_PROTOTYPE);
556     Handle<AccessorInfo> length =
557         Accessors::FunctionLengthInfo(isolate(), ro_attribs);
558     CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())),
559                           length, ro_attribs);
560     map->AppendDescriptor(&d);
561   }
562   Handle<AccessorInfo> name =
563       Accessors::FunctionNameInfo(isolate(), ro_attribs);
564   {  // Add name.
565     CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())),
566                           name, ro_attribs);
567     map->AppendDescriptor(&d);
568   }
569   {  // Add arguments.
570     CallbacksDescriptor d(factory()->arguments_string(), arguments,
571                           rw_attribs);
572     map->AppendDescriptor(&d);
573   }
574   {  // Add caller.
575     CallbacksDescriptor d(factory()->caller_string(), caller, rw_attribs);
576     map->AppendDescriptor(&d);
577   }
578   if (IsFunctionModeWithPrototype(function_mode)) {
579     // Add prototype.
580     PropertyAttributes attribs =
581         function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs
582                                                            : ro_attribs;
583     Handle<AccessorInfo> prototype =
584         Accessors::FunctionPrototypeInfo(isolate(), attribs);
585     CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())),
586                           prototype, attribs);
587     map->AppendDescriptor(&d);
588   }
589 }
590
591
592 // ECMAScript 5th Edition, 13.2.3
593 Handle<JSFunction> Genesis::GetStrictPoisonFunction() {
594   if (strict_poison_function.is_null()) {
595     Handle<String> name = factory()->InternalizeOneByteString(
596         STATIC_ASCII_VECTOR("ThrowTypeError"));
597     Handle<Code> code(isolate()->builtins()->builtin(
598         Builtins::kStrictModePoisonPill));
599     strict_poison_function = factory()->NewFunctionWithoutPrototype(name, code);
600     strict_poison_function->set_map(native_context()->sloppy_function_map());
601     strict_poison_function->shared()->DontAdaptArguments();
602
603     JSObject::PreventExtensions(strict_poison_function).Assert();
604   }
605   return strict_poison_function;
606 }
607
608
609 Handle<JSFunction> Genesis::GetGeneratorPoisonFunction() {
610   if (generator_poison_function.is_null()) {
611     Handle<String> name = factory()->InternalizeOneByteString(
612         STATIC_ASCII_VECTOR("ThrowTypeError"));
613     Handle<Code> code(isolate()->builtins()->builtin(
614         Builtins::kGeneratorPoisonPill));
615     generator_poison_function = factory()->NewFunctionWithoutPrototype(
616         name, code);
617     generator_poison_function->set_map(native_context()->sloppy_function_map());
618     generator_poison_function->shared()->DontAdaptArguments();
619
620     JSObject::PreventExtensions(generator_poison_function).Assert();
621   }
622   return generator_poison_function;
623 }
624
625
626 Handle<Map> Genesis::CreateStrictFunctionMap(
627     FunctionMode function_mode,
628     Handle<JSFunction> empty_function) {
629   Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
630   SetStrictFunctionInstanceDescriptor(map, function_mode);
631   map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
632   map->set_prototype(*empty_function);
633   return map;
634 }
635
636
637 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
638   // Allocate map for the prototype-less strict mode instances.
639   Handle<Map> strict_function_without_prototype_map =
640       CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
641   native_context()->set_strict_function_without_prototype_map(
642       *strict_function_without_prototype_map);
643
644   // Allocate map for the strict mode functions. This map is temporary, used
645   // only for processing of builtins.
646   // Later the map is replaced with writable prototype map, allocated below.
647   Handle<Map> strict_function_map =
648       CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty);
649   native_context()->set_strict_function_map(*strict_function_map);
650
651   // The final map for the strict mode functions. Writeable prototype.
652   // This map is installed in MakeFunctionInstancePrototypeWritable.
653   strict_function_map_writable_prototype_ =
654       CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty);
655   // Special map for bound functions.
656   Handle<Map> bound_function_map =
657       CreateStrictFunctionMap(BOUND_FUNCTION, empty);
658   native_context()->set_bound_function_map(*bound_function_map);
659
660   // Complete the callbacks.
661   PoisonArgumentsAndCaller(strict_function_without_prototype_map);
662   PoisonArgumentsAndCaller(strict_function_map);
663   PoisonArgumentsAndCaller(strict_function_map_writable_prototype_);
664   PoisonArgumentsAndCaller(bound_function_map);
665 }
666
667
668 static void SetAccessors(Handle<Map> map,
669                          Handle<String> name,
670                          Handle<JSFunction> func) {
671   DescriptorArray* descs = map->instance_descriptors();
672   int number = descs->SearchWithCache(*name, *map);
673   AccessorPair* accessors = AccessorPair::cast(descs->GetValue(number));
674   accessors->set_getter(*func);
675   accessors->set_setter(*func);
676 }
677
678
679 static void ReplaceAccessors(Handle<Map> map,
680                              Handle<String> name,
681                              PropertyAttributes attributes,
682                              Handle<AccessorPair> accessor_pair) {
683   DescriptorArray* descriptors = map->instance_descriptors();
684   int idx = descriptors->SearchWithCache(*name, *map);
685   CallbacksDescriptor descriptor(name, accessor_pair, attributes);
686   descriptors->Replace(idx, &descriptor);
687 }
688
689
690 void Genesis::PoisonArgumentsAndCaller(Handle<Map> map) {
691   SetAccessors(map, factory()->arguments_string(), GetStrictPoisonFunction());
692   SetAccessors(map, factory()->caller_string(), GetStrictPoisonFunction());
693 }
694
695
696 static void AddToWeakNativeContextList(Context* context) {
697   ASSERT(context->IsNativeContext());
698   Heap* heap = context->GetIsolate()->heap();
699 #ifdef DEBUG
700   { // NOLINT
701     ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined());
702     // Check that context is not in the list yet.
703     for (Object* current = heap->native_contexts_list();
704          !current->IsUndefined();
705          current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) {
706       ASSERT(current != context);
707     }
708   }
709 #endif
710   context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list());
711   heap->set_native_contexts_list(context);
712 }
713
714
715 void Genesis::CreateRoots() {
716   // Allocate the native context FixedArray first and then patch the
717   // closure and extension object later (we need the empty function
718   // and the global object, but in order to create those, we need the
719   // native context).
720   native_context_ = factory()->NewNativeContext();
721   AddToWeakNativeContextList(*native_context());
722   isolate()->set_context(*native_context());
723
724   // Allocate the message listeners object.
725   {
726     v8::NeanderArray listeners(isolate());
727     native_context()->set_message_listeners(*listeners.value());
728   }
729 }
730
731
732 Handle<JSGlobalProxy> Genesis::CreateNewGlobals(
733     v8::Handle<v8::ObjectTemplate> global_template,
734     Handle<Object> global_object,
735     Handle<GlobalObject>* inner_global_out) {
736   // The argument global_template aka data is an ObjectTemplateInfo.
737   // It has a constructor pointer that points at global_constructor which is a
738   // FunctionTemplateInfo.
739   // The global_constructor is used to create or reinitialize the global_proxy.
740   // The global_constructor also has a prototype_template pointer that points at
741   // js_global_template which is an ObjectTemplateInfo.
742   // That in turn has a constructor pointer that points at
743   // js_global_constructor which is a FunctionTemplateInfo.
744   // js_global_constructor is used to make js_global_function
745   // js_global_function is used to make the new inner_global.
746   //
747   // --- G l o b a l ---
748   // Step 1: Create a fresh inner JSGlobalObject.
749   Handle<JSFunction> js_global_function;
750   Handle<ObjectTemplateInfo> js_global_template;
751   if (!global_template.IsEmpty()) {
752     // Get prototype template of the global_template.
753     Handle<ObjectTemplateInfo> data =
754         v8::Utils::OpenHandle(*global_template);
755     Handle<FunctionTemplateInfo> global_constructor =
756         Handle<FunctionTemplateInfo>(
757             FunctionTemplateInfo::cast(data->constructor()));
758     Handle<Object> proto_template(global_constructor->prototype_template(),
759                                   isolate());
760     if (!proto_template->IsUndefined()) {
761       js_global_template =
762           Handle<ObjectTemplateInfo>::cast(proto_template);
763     }
764   }
765
766   if (js_global_template.is_null()) {
767     Handle<String> name = Handle<String>(heap()->empty_string());
768     Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin(
769         Builtins::kIllegal));
770     js_global_function = factory()->NewFunction(
771         name, code, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize);
772     // Change the constructor property of the prototype of the
773     // hidden global function to refer to the Object function.
774     Handle<JSObject> prototype =
775         Handle<JSObject>(
776             JSObject::cast(js_global_function->instance_prototype()));
777     JSObject::SetOwnPropertyIgnoreAttributes(
778         prototype, factory()->constructor_string(),
779         isolate()->object_function(), NONE).Check();
780   } else {
781     Handle<FunctionTemplateInfo> js_global_constructor(
782         FunctionTemplateInfo::cast(js_global_template->constructor()));
783     js_global_function =
784         factory()->CreateApiFunction(js_global_constructor,
785                                      factory()->the_hole_value(),
786                                      factory()->InnerGlobalObject);
787   }
788
789   js_global_function->initial_map()->set_is_hidden_prototype();
790   js_global_function->initial_map()->set_dictionary_map(true);
791   Handle<GlobalObject> inner_global =
792       factory()->NewGlobalObject(js_global_function);
793   if (inner_global_out != NULL) {
794     *inner_global_out = inner_global;
795   }
796
797   // Step 2: create or re-initialize the global proxy object.
798   Handle<JSFunction> global_proxy_function;
799   if (global_template.IsEmpty()) {
800     Handle<String> name = Handle<String>(heap()->empty_string());
801     Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin(
802         Builtins::kIllegal));
803     global_proxy_function = factory()->NewFunction(
804         name, code, JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize);
805   } else {
806     Handle<ObjectTemplateInfo> data =
807         v8::Utils::OpenHandle(*global_template);
808     Handle<FunctionTemplateInfo> global_constructor(
809             FunctionTemplateInfo::cast(data->constructor()));
810     global_proxy_function =
811         factory()->CreateApiFunction(global_constructor,
812                                      factory()->the_hole_value(),
813                                      factory()->OuterGlobalObject);
814   }
815
816   Handle<String> global_name = factory()->InternalizeOneByteString(
817       STATIC_ASCII_VECTOR("global"));
818   global_proxy_function->shared()->set_instance_class_name(*global_name);
819   global_proxy_function->initial_map()->set_is_access_check_needed(true);
820
821   // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects
822   // Return the global proxy.
823
824   Handle<JSGlobalProxy> global_proxy;
825   if (global_object.location() != NULL) {
826     ASSERT(global_object->IsJSGlobalProxy());
827     global_proxy = Handle<JSGlobalProxy>::cast(global_object);
828     factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
829   } else {
830     global_proxy = Handle<JSGlobalProxy>::cast(
831         factory()->NewJSObject(global_proxy_function, TENURED));
832     global_proxy->set_hash(heap()->undefined_value());
833   }
834   return global_proxy;
835 }
836
837
838 void Genesis::HookUpGlobalProxy(Handle<GlobalObject> inner_global,
839                                 Handle<JSGlobalProxy> global_proxy) {
840   // Set the native context for the global object.
841   inner_global->set_native_context(*native_context());
842   inner_global->set_global_context(*native_context());
843   inner_global->set_global_receiver(*global_proxy);
844   global_proxy->set_native_context(*native_context());
845   native_context()->set_global_proxy(*global_proxy);
846 }
847
848
849 void Genesis::HookUpInnerGlobal(Handle<GlobalObject> inner_global) {
850   Handle<GlobalObject> inner_global_from_snapshot(
851       GlobalObject::cast(native_context()->extension()));
852   Handle<JSBuiltinsObject> builtins_global(native_context()->builtins());
853   native_context()->set_extension(*inner_global);
854   native_context()->set_global_object(*inner_global);
855   native_context()->set_security_token(*inner_global);
856   static const PropertyAttributes attributes =
857       static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
858   Runtime::ForceSetObjectProperty(builtins_global,
859                                   factory()->InternalizeOneByteString(
860                                       STATIC_ASCII_VECTOR("global")),
861                                   inner_global,
862                                   attributes).Assert();
863   // Set up the reference from the global object to the builtins object.
864   JSGlobalObject::cast(*inner_global)->set_builtins(*builtins_global);
865   TransferNamedProperties(inner_global_from_snapshot, inner_global);
866   TransferIndexedProperties(inner_global_from_snapshot, inner_global);
867 }
868
869
870 // This is only called if we are not using snapshots.  The equivalent
871 // work in the snapshot case is done in HookUpInnerGlobal.
872 void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
873                                Handle<JSFunction> empty_function) {
874   // --- N a t i v e   C o n t e x t ---
875   // Use the empty function as closure (no scope info).
876   native_context()->set_closure(*empty_function);
877   native_context()->set_previous(NULL);
878   // Set extension and global object.
879   native_context()->set_extension(*inner_global);
880   native_context()->set_global_object(*inner_global);
881   // Security setup: Set the security token of the global object to
882   // its the inner global. This makes the security check between two
883   // different contexts fail by default even in case of global
884   // object reinitialization.
885   native_context()->set_security_token(*inner_global);
886
887   Isolate* isolate = inner_global->GetIsolate();
888   Factory* factory = isolate->factory();
889   Heap* heap = isolate->heap();
890
891   Handle<String> object_name = factory->Object_string();
892   JSObject::SetOwnPropertyIgnoreAttributes(
893       inner_global, object_name,
894       isolate->object_function(), DONT_ENUM).Check();
895
896   Handle<JSObject> global(native_context()->global_object());
897
898   // Install global Function object
899   InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
900                   empty_function, Builtins::kIllegal);
901
902   {  // --- A r r a y ---
903     Handle<JSFunction> array_function =
904         InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
905                         isolate->initial_object_prototype(),
906                         Builtins::kArrayCode);
907     array_function->shared()->DontAdaptArguments();
908     array_function->shared()->set_function_data(Smi::FromInt(kArrayCode));
909
910     // This seems a bit hackish, but we need to make sure Array.length
911     // is 1.
912     array_function->shared()->set_length(1);
913
914     Handle<Map> initial_map(array_function->initial_map());
915
916     // This assert protects an optimization in
917     // HGraphBuilder::JSArrayBuilder::EmitMapCode()
918     ASSERT(initial_map->elements_kind() == GetInitialFastElementsKind());
919     Map::EnsureDescriptorSlack(initial_map, 1);
920
921     PropertyAttributes attribs = static_cast<PropertyAttributes>(
922         DONT_ENUM | DONT_DELETE);
923
924     Handle<AccessorInfo> array_length =
925         Accessors::ArrayLengthInfo(isolate, attribs);
926     {  // Add length.
927       CallbacksDescriptor d(
928           Handle<Name>(Name::cast(array_length->name())),
929           array_length, attribs);
930       array_function->initial_map()->AppendDescriptor(&d);
931     }
932
933     // array_function is used internally. JS code creating array object should
934     // search for the 'Array' property on the global object and use that one
935     // as the constructor. 'Array' property on a global object can be
936     // overwritten by JS code.
937     native_context()->set_array_function(*array_function);
938
939     // Cache the array maps, needed by ArrayConstructorStub
940     CacheInitialJSArrayMaps(native_context(), initial_map);
941     ArrayConstructorStub array_constructor_stub(isolate);
942     Handle<Code> code = array_constructor_stub.GetCode();
943     array_function->shared()->set_construct_stub(*code);
944   }
945
946   {  // --- N u m b e r ---
947     Handle<JSFunction> number_fun =
948         InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
949                         isolate->initial_object_prototype(),
950                         Builtins::kIllegal);
951     native_context()->set_number_function(*number_fun);
952   }
953
954   {  // --- B o o l e a n ---
955     Handle<JSFunction> boolean_fun =
956         InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
957                         isolate->initial_object_prototype(),
958                         Builtins::kIllegal);
959     native_context()->set_boolean_function(*boolean_fun);
960   }
961
962   {  // --- S t r i n g ---
963     Handle<JSFunction> string_fun =
964         InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
965                         isolate->initial_object_prototype(),
966                         Builtins::kIllegal);
967     string_fun->shared()->set_construct_stub(
968         isolate->builtins()->builtin(Builtins::kStringConstructCode));
969     native_context()->set_string_function(*string_fun);
970
971     Handle<Map> string_map =
972         Handle<Map>(native_context()->string_function()->initial_map());
973     Map::EnsureDescriptorSlack(string_map, 1);
974
975     PropertyAttributes attribs = static_cast<PropertyAttributes>(
976         DONT_ENUM | DONT_DELETE | READ_ONLY);
977     Handle<AccessorInfo> string_length(
978         Accessors::StringLengthInfo(isolate, attribs));
979
980     {  // Add length.
981       CallbacksDescriptor d(factory->length_string(), string_length, attribs);
982       string_map->AppendDescriptor(&d);
983     }
984   }
985
986   {  // --- D a t e ---
987     // Builtin functions for Date.prototype.
988     Handle<JSFunction> date_fun =
989         InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize,
990                         isolate->initial_object_prototype(),
991                         Builtins::kIllegal);
992
993     native_context()->set_date_function(*date_fun);
994   }
995
996
997   {  // -- R e g E x p
998     // Builtin functions for RegExp.prototype.
999     Handle<JSFunction> regexp_fun =
1000         InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
1001                         isolate->initial_object_prototype(),
1002                         Builtins::kIllegal);
1003     native_context()->set_regexp_function(*regexp_fun);
1004
1005     ASSERT(regexp_fun->has_initial_map());
1006     Handle<Map> initial_map(regexp_fun->initial_map());
1007
1008     ASSERT_EQ(0, initial_map->inobject_properties());
1009
1010     PropertyAttributes final =
1011         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
1012     Map::EnsureDescriptorSlack(initial_map, 5);
1013
1014     {
1015       // ECMA-262, section 15.10.7.1.
1016       FieldDescriptor field(factory->source_string(),
1017                             JSRegExp::kSourceFieldIndex,
1018                             final,
1019                             Representation::Tagged());
1020       initial_map->AppendDescriptor(&field);
1021     }
1022     {
1023       // ECMA-262, section 15.10.7.2.
1024       FieldDescriptor field(factory->global_string(),
1025                             JSRegExp::kGlobalFieldIndex,
1026                             final,
1027                             Representation::Tagged());
1028       initial_map->AppendDescriptor(&field);
1029     }
1030     {
1031       // ECMA-262, section 15.10.7.3.
1032       FieldDescriptor field(factory->ignore_case_string(),
1033                             JSRegExp::kIgnoreCaseFieldIndex,
1034                             final,
1035                             Representation::Tagged());
1036       initial_map->AppendDescriptor(&field);
1037     }
1038     {
1039       // ECMA-262, section 15.10.7.4.
1040       FieldDescriptor field(factory->multiline_string(),
1041                             JSRegExp::kMultilineFieldIndex,
1042                             final,
1043                             Representation::Tagged());
1044       initial_map->AppendDescriptor(&field);
1045     }
1046     {
1047       // ECMA-262, section 15.10.7.5.
1048       PropertyAttributes writable =
1049           static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
1050       FieldDescriptor field(factory->last_index_string(),
1051                             JSRegExp::kLastIndexFieldIndex,
1052                             writable,
1053                             Representation::Tagged());
1054       initial_map->AppendDescriptor(&field);
1055     }
1056
1057     initial_map->set_inobject_properties(5);
1058     initial_map->set_pre_allocated_property_fields(5);
1059     initial_map->set_unused_property_fields(0);
1060     initial_map->set_instance_size(
1061         initial_map->instance_size() + 5 * kPointerSize);
1062     initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map));
1063
1064     // RegExp prototype object is itself a RegExp.
1065     Handle<Map> proto_map = Map::Copy(initial_map);
1066     proto_map->set_prototype(native_context()->initial_object_prototype());
1067     Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map);
1068     proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex,
1069                                  heap->query_colon_string());
1070     proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex,
1071                                  heap->false_value());
1072     proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex,
1073                                  heap->false_value());
1074     proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex,
1075                                  heap->false_value());
1076     proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
1077                                  Smi::FromInt(0),
1078                                  SKIP_WRITE_BARRIER);  // It's a Smi.
1079     initial_map->set_prototype(*proto);
1080     factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto),
1081                                    JSRegExp::IRREGEXP, factory->empty_string(),
1082                                    JSRegExp::Flags(0), 0);
1083   }
1084
1085   {  // -- J S O N
1086     Handle<String> name = factory->InternalizeUtf8String("JSON");
1087     Handle<JSFunction> cons = factory->NewFunction(name);
1088     JSFunction::SetInstancePrototype(cons,
1089         Handle<Object>(native_context()->initial_object_prototype(), isolate));
1090     cons->SetInstanceClassName(*name);
1091     Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED);
1092     ASSERT(json_object->IsJSObject());
1093     JSObject::SetOwnPropertyIgnoreAttributes(
1094         global, name, json_object, DONT_ENUM).Check();
1095     native_context()->set_json_object(*json_object);
1096   }
1097
1098   {  // -- A r r a y B u f f e r
1099     Handle<JSFunction> array_buffer_fun =
1100         InstallFunction(
1101             global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE,
1102             JSArrayBuffer::kSizeWithInternalFields,
1103             isolate->initial_object_prototype(),
1104             Builtins::kIllegal);
1105     native_context()->set_array_buffer_fun(*array_buffer_fun);
1106   }
1107
1108   {  // -- T y p e d A r r a y s
1109 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size)                    \
1110     {                                                                         \
1111       Handle<JSFunction> fun;                                                 \
1112       Handle<Map> external_map;                                               \
1113       InstallTypedArray(#Type "Array",                                        \
1114           TYPE##_ELEMENTS,                                                    \
1115           &fun,                                                               \
1116           &external_map);                                                     \
1117       native_context()->set_##type##_array_fun(*fun);                         \
1118       native_context()->set_##type##_array_external_map(*external_map);       \
1119     }
1120     TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
1121 #undef INSTALL_TYPED_ARRAY
1122
1123     Handle<JSFunction> data_view_fun =
1124         InstallFunction(
1125             global, "DataView", JS_DATA_VIEW_TYPE,
1126             JSDataView::kSizeWithInternalFields,
1127             isolate->initial_object_prototype(),
1128             Builtins::kIllegal);
1129     native_context()->set_data_view_fun(*data_view_fun);
1130   }
1131
1132   // -- W e a k M a p
1133   InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
1134                   isolate->initial_object_prototype(), Builtins::kIllegal);
1135   // -- W e a k S e t
1136   InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
1137                   isolate->initial_object_prototype(), Builtins::kIllegal);
1138
1139   {  // --- arguments_boilerplate_
1140     // Make sure we can recognize argument objects at runtime.
1141     // This is done by introducing an anonymous function with
1142     // class_name equals 'Arguments'.
1143     Handle<String> arguments_string = factory->InternalizeOneByteString(
1144         STATIC_ASCII_VECTOR("Arguments"));
1145     Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal));
1146
1147     Handle<JSFunction> function = factory->NewFunctionWithoutPrototype(
1148         arguments_string, code);
1149     ASSERT(!function->has_initial_map());
1150     function->shared()->set_instance_class_name(*arguments_string);
1151     function->shared()->set_expected_nof_properties(2);
1152     function->set_prototype_or_initial_map(
1153         native_context()->object_function()->prototype());
1154     Handle<JSObject> result = factory->NewJSObject(function);
1155
1156     native_context()->set_sloppy_arguments_boilerplate(*result);
1157     // Note: length must be added as the first property and
1158     //       callee must be added as the second property.
1159     JSObject::SetOwnPropertyIgnoreAttributes(
1160         result, factory->length_string(),
1161         factory->undefined_value(), DONT_ENUM,
1162         Object::FORCE_TAGGED, FORCE_FIELD).Check();
1163     JSObject::SetOwnPropertyIgnoreAttributes(
1164         result, factory->callee_string(),
1165         factory->undefined_value(), DONT_ENUM,
1166         Object::FORCE_TAGGED, FORCE_FIELD).Check();
1167
1168 #ifdef DEBUG
1169     LookupResult lookup(isolate);
1170     result->LookupOwn(factory->callee_string(), &lookup);
1171     ASSERT(lookup.IsField());
1172     ASSERT(lookup.GetFieldIndex().property_index() ==
1173            Heap::kArgumentsCalleeIndex);
1174
1175     result->LookupOwn(factory->length_string(), &lookup);
1176     ASSERT(lookup.IsField());
1177     ASSERT(lookup.GetFieldIndex().property_index() ==
1178            Heap::kArgumentsLengthIndex);
1179
1180     ASSERT(result->map()->inobject_properties() > Heap::kArgumentsCalleeIndex);
1181     ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex);
1182
1183     // Check the state of the object.
1184     ASSERT(result->HasFastProperties());
1185     ASSERT(result->HasFastObjectElements());
1186 #endif
1187   }
1188
1189   {  // --- aliased_arguments_boilerplate_
1190     // Set up a well-formed parameter map to make assertions happy.
1191     Handle<FixedArray> elements = factory->NewFixedArray(2);
1192     elements->set_map(heap->sloppy_arguments_elements_map());
1193     Handle<FixedArray> array;
1194     array = factory->NewFixedArray(0);
1195     elements->set(0, *array);
1196     array = factory->NewFixedArray(0);
1197     elements->set(1, *array);
1198
1199     Handle<Map> old_map(
1200         native_context()->sloppy_arguments_boilerplate()->map());
1201     Handle<Map> new_map = Map::Copy(old_map);
1202     new_map->set_pre_allocated_property_fields(2);
1203     Handle<JSObject> result = factory->NewJSObjectFromMap(new_map);
1204     // Set elements kind after allocating the object because
1205     // NewJSObjectFromMap assumes a fast elements map.
1206     new_map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS);
1207     result->set_elements(*elements);
1208     ASSERT(result->HasSloppyArgumentsElements());
1209     native_context()->set_aliased_arguments_boilerplate(*result);
1210   }
1211
1212   {  // --- strict mode arguments boilerplate
1213     const PropertyAttributes attributes =
1214       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
1215
1216     // Create the ThrowTypeError functions.
1217     Handle<AccessorPair> callee = factory->NewAccessorPair();
1218     Handle<AccessorPair> caller = factory->NewAccessorPair();
1219
1220     Handle<JSFunction> poison = GetStrictPoisonFunction();
1221
1222     // Install the ThrowTypeError functions.
1223     callee->set_getter(*poison);
1224     callee->set_setter(*poison);
1225     caller->set_getter(*poison);
1226     caller->set_setter(*poison);
1227
1228     // Create the map. Allocate one in-object field for length.
1229     Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE,
1230                                       Heap::kStrictArgumentsObjectSize);
1231     // Create the descriptor array for the arguments object.
1232     Map::EnsureDescriptorSlack(map, 3);
1233
1234     {  // length
1235       FieldDescriptor d(
1236           factory->length_string(), 0, DONT_ENUM, Representation::Tagged());
1237       map->AppendDescriptor(&d);
1238     }
1239     {  // callee
1240       CallbacksDescriptor d(factory->callee_string(),
1241                             callee,
1242                             attributes);
1243       map->AppendDescriptor(&d);
1244     }
1245     {  // caller
1246       CallbacksDescriptor d(factory->caller_string(),
1247                             caller,
1248                             attributes);
1249       map->AppendDescriptor(&d);
1250     }
1251
1252     map->set_function_with_prototype(true);
1253     map->set_prototype(native_context()->object_function()->prototype());
1254     map->set_pre_allocated_property_fields(1);
1255     map->set_inobject_properties(1);
1256
1257     // Copy constructor from the sloppy arguments boilerplate.
1258     map->set_constructor(
1259       native_context()->sloppy_arguments_boilerplate()->map()->constructor());
1260
1261     // Allocate the arguments boilerplate object.
1262     Handle<JSObject> result = factory->NewJSObjectFromMap(map);
1263     native_context()->set_strict_arguments_boilerplate(*result);
1264
1265     // Add length property only for strict mode boilerplate.
1266     JSObject::SetOwnPropertyIgnoreAttributes(
1267         result, factory->length_string(),
1268         factory->undefined_value(), DONT_ENUM).Check();
1269
1270 #ifdef DEBUG
1271     LookupResult lookup(isolate);
1272     result->LookupOwn(factory->length_string(), &lookup);
1273     ASSERT(lookup.IsField());
1274     ASSERT(lookup.GetFieldIndex().property_index() ==
1275            Heap::kArgumentsLengthIndex);
1276
1277     ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex);
1278
1279     // Check the state of the object.
1280     ASSERT(result->HasFastProperties());
1281     ASSERT(result->HasFastObjectElements());
1282 #endif
1283   }
1284
1285   {  // --- context extension
1286     // Create a function for the context extension objects.
1287     Handle<Code> code = Handle<Code>(
1288         isolate->builtins()->builtin(Builtins::kIllegal));
1289     Handle<JSFunction> context_extension_fun = factory->NewFunction(
1290         factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE,
1291         JSObject::kHeaderSize);
1292
1293     Handle<String> name = factory->InternalizeOneByteString(
1294         STATIC_ASCII_VECTOR("context_extension"));
1295     context_extension_fun->shared()->set_instance_class_name(*name);
1296     native_context()->set_context_extension_function(*context_extension_fun);
1297   }
1298
1299
1300   {
1301     // Set up the call-as-function delegate.
1302     Handle<Code> code =
1303         Handle<Code>(isolate->builtins()->builtin(
1304             Builtins::kHandleApiCallAsFunction));
1305     Handle<JSFunction> delegate = factory->NewFunction(
1306         factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1307     native_context()->set_call_as_function_delegate(*delegate);
1308     delegate->shared()->DontAdaptArguments();
1309   }
1310
1311   {
1312     // Set up the call-as-constructor delegate.
1313     Handle<Code> code =
1314         Handle<Code>(isolate->builtins()->builtin(
1315             Builtins::kHandleApiCallAsConstructor));
1316     Handle<JSFunction> delegate = factory->NewFunction(
1317         factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1318     native_context()->set_call_as_constructor_delegate(*delegate);
1319     delegate->shared()->DontAdaptArguments();
1320   }
1321
1322   // Initialize the embedder data slot.
1323   Handle<FixedArray> embedder_data = factory->NewFixedArray(3);
1324   native_context()->set_embedder_data(*embedder_data);
1325 }
1326
1327
1328 void Genesis::InstallTypedArray(
1329     const char* name,
1330     ElementsKind elements_kind,
1331     Handle<JSFunction>* fun,
1332     Handle<Map>* external_map) {
1333   Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1334   Handle<JSFunction> result = InstallFunction(
1335       global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize,
1336       isolate()->initial_object_prototype(), Builtins::kIllegal);
1337
1338   Handle<Map> initial_map = isolate()->factory()->NewMap(
1339       JS_TYPED_ARRAY_TYPE,
1340       JSTypedArray::kSizeWithInternalFields,
1341       elements_kind);
1342   result->set_initial_map(*initial_map);
1343   initial_map->set_constructor(*result);
1344   *fun = result;
1345
1346   ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind);
1347   *external_map = Map::AsElementsKind(initial_map, external_kind);
1348 }
1349
1350
1351 void Genesis::InitializeExperimentalGlobal() {
1352   Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1353
1354   // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no
1355   // longer need to live behind flags, so functions get added to the snapshot.
1356
1357   if (FLAG_harmony_symbols) {
1358     // --- S y m b o l ---
1359     Handle<JSFunction> symbol_fun = InstallFunction(
1360         global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
1361         isolate()->initial_object_prototype(), Builtins::kIllegal);
1362     native_context()->set_symbol_function(*symbol_fun);
1363   }
1364
1365   if (FLAG_harmony_collections) {
1366     // -- M a p
1367     InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize,
1368                     isolate()->initial_object_prototype(), Builtins::kIllegal);
1369     // -- S e t
1370     InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize,
1371                     isolate()->initial_object_prototype(), Builtins::kIllegal);
1372     {   // -- S e t I t e r a t o r
1373       Handle<JSObject> builtins(native_context()->builtins());
1374       Handle<JSFunction> set_iterator_function =
1375           InstallFunction(builtins, "SetIterator", JS_SET_ITERATOR_TYPE,
1376                           JSSetIterator::kSize,
1377                           isolate()->initial_object_prototype(),
1378                           Builtins::kIllegal);
1379       native_context()->set_set_iterator_map(
1380           set_iterator_function->initial_map());
1381     }
1382     {   // -- M a p I t e r a t o r
1383       Handle<JSObject> builtins(native_context()->builtins());
1384       Handle<JSFunction> map_iterator_function =
1385           InstallFunction(builtins, "MapIterator", JS_MAP_ITERATOR_TYPE,
1386                           JSMapIterator::kSize,
1387                           isolate()->initial_object_prototype(),
1388                           Builtins::kIllegal);
1389       native_context()->set_map_iterator_map(
1390           map_iterator_function->initial_map());
1391     }
1392   }
1393
1394   if (FLAG_harmony_generators) {
1395     // Create generator meta-objects and install them on the builtins object.
1396     Handle<JSObject> builtins(native_context()->builtins());
1397     Handle<JSObject> generator_object_prototype =
1398         factory()->NewJSObject(isolate()->object_function(), TENURED);
1399     Handle<JSFunction> generator_function_prototype = InstallFunction(
1400         builtins, "GeneratorFunctionPrototype", JS_FUNCTION_TYPE,
1401         JSFunction::kHeaderSize, generator_object_prototype,
1402         Builtins::kIllegal);
1403     InstallFunction(builtins, "GeneratorFunction",
1404                     JS_FUNCTION_TYPE, JSFunction::kSize,
1405                     generator_function_prototype, Builtins::kIllegal);
1406
1407     // Create maps for generator functions and their prototypes.  Store those
1408     // maps in the native context.
1409     Handle<Map> sloppy_function_map(native_context()->sloppy_function_map());
1410     Handle<Map> generator_function_map = Map::Copy(sloppy_function_map);
1411     generator_function_map->set_prototype(*generator_function_prototype);
1412     native_context()->set_sloppy_generator_function_map(
1413         *generator_function_map);
1414
1415     // The "arguments" and "caller" instance properties aren't specified, so
1416     // technically we could leave them out.  They make even less sense for
1417     // generators than for functions.  Still, the same argument that it makes
1418     // sense to keep them around but poisoned in strict mode applies to
1419     // generators as well.  With poisoned accessors, naive callers can still
1420     // iterate over the properties without accessing them.
1421     //
1422     // We can't use PoisonArgumentsAndCaller because that mutates accessor pairs
1423     // in place, and the initial state of the generator function map shares the
1424     // accessor pair with sloppy functions.  Also the error message should be
1425     // different.  Also unhappily, we can't use the API accessors to implement
1426     // poisoning, because API accessors present themselves as data properties,
1427     // not accessor properties, and so getOwnPropertyDescriptor raises an
1428     // exception as it tries to get the values.  Sadness.
1429     Handle<AccessorPair> poison_pair(factory()->NewAccessorPair());
1430     PropertyAttributes rw_attribs =
1431         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
1432     Handle<JSFunction> poison_function = GetGeneratorPoisonFunction();
1433     poison_pair->set_getter(*poison_function);
1434     poison_pair->set_setter(*poison_function);
1435     ReplaceAccessors(generator_function_map, factory()->arguments_string(),
1436         rw_attribs, poison_pair);
1437     ReplaceAccessors(generator_function_map, factory()->caller_string(),
1438         rw_attribs, poison_pair);
1439
1440     Handle<Map> strict_function_map(native_context()->strict_function_map());
1441     Handle<Map> strict_generator_function_map = Map::Copy(strict_function_map);
1442     // "arguments" and "caller" already poisoned.
1443     strict_generator_function_map->set_prototype(*generator_function_prototype);
1444     native_context()->set_strict_generator_function_map(
1445         *strict_generator_function_map);
1446
1447     Handle<JSFunction> object_function(native_context()->object_function());
1448     Handle<Map> generator_object_prototype_map = Map::Create(
1449         object_function, 0);
1450     generator_object_prototype_map->set_prototype(
1451         *generator_object_prototype);
1452     native_context()->set_generator_object_prototype_map(
1453         *generator_object_prototype_map);
1454   }
1455
1456   if (FLAG_harmony_collections || FLAG_harmony_generators) {
1457     // Collection forEach uses an iterator result object.
1458     // Generators return iteraror result objects.
1459
1460     STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2);
1461     Handle<JSFunction> object_function(native_context()->object_function());
1462     ASSERT(object_function->initial_map()->inobject_properties() == 0);
1463     Handle<Map> iterator_result_map = Map::Create(
1464         object_function, JSGeneratorObject::kResultPropertyCount);
1465     ASSERT(iterator_result_map->inobject_properties() ==
1466         JSGeneratorObject::kResultPropertyCount);
1467     Map::EnsureDescriptorSlack(
1468         iterator_result_map, JSGeneratorObject::kResultPropertyCount);
1469
1470     FieldDescriptor value_descr(isolate()->factory()->value_string(),
1471                                 JSGeneratorObject::kResultValuePropertyIndex,
1472                                 NONE,
1473                                 Representation::Tagged());
1474     iterator_result_map->AppendDescriptor(&value_descr);
1475
1476     FieldDescriptor done_descr(isolate()->factory()->done_string(),
1477                                JSGeneratorObject::kResultDonePropertyIndex,
1478                                NONE,
1479                                Representation::Tagged());
1480     iterator_result_map->AppendDescriptor(&done_descr);
1481
1482     iterator_result_map->set_unused_property_fields(0);
1483     ASSERT_EQ(JSGeneratorObject::kResultSize,
1484               iterator_result_map->instance_size());
1485     native_context()->set_iterator_result_map(*iterator_result_map);
1486   }
1487 }
1488
1489
1490 bool Genesis::CompileBuiltin(Isolate* isolate, int index) {
1491   Vector<const char> name = Natives::GetScriptName(index);
1492   Handle<String> source_code =
1493       isolate->bootstrapper()->NativesSourceLookup(index);
1494   return CompileNative(isolate, name, source_code);
1495 }
1496
1497
1498 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) {
1499   Vector<const char> name = ExperimentalNatives::GetScriptName(index);
1500   Factory* factory = isolate->factory();
1501   Handle<String> source_code;
1502   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
1503       isolate, source_code,
1504       factory->NewStringFromAscii(
1505           ExperimentalNatives::GetRawScriptSource(index)),
1506       false);
1507   return CompileNative(isolate, name, source_code);
1508 }
1509
1510
1511 bool Genesis::CompileNative(Isolate* isolate,
1512                             Vector<const char> name,
1513                             Handle<String> source) {
1514   HandleScope scope(isolate);
1515   SuppressDebug compiling_natives(isolate->debug());
1516   // During genesis, the boilerplate for stack overflow won't work until the
1517   // environment has been at least partially initialized. Add a stack check
1518   // before entering JS code to catch overflow early.
1519   StackLimitCheck check(isolate);
1520   if (check.HasOverflowed()) return false;
1521
1522   bool result = CompileScriptCached(isolate,
1523                                     name,
1524                                     source,
1525                                     NULL,
1526                                     NULL,
1527                                     Handle<Context>(isolate->context()),
1528                                     true);
1529   ASSERT(isolate->has_pending_exception() != result);
1530   if (!result) isolate->clear_pending_exception();
1531   return result;
1532 }
1533
1534
1535 bool Genesis::CompileScriptCached(Isolate* isolate,
1536                                   Vector<const char> name,
1537                                   Handle<String> source,
1538                                   SourceCodeCache* cache,
1539                                   v8::Extension* extension,
1540                                   Handle<Context> top_context,
1541                                   bool use_runtime_context) {
1542   Factory* factory = isolate->factory();
1543   HandleScope scope(isolate);
1544   Handle<SharedFunctionInfo> function_info;
1545
1546   // If we can't find the function in the cache, we compile a new
1547   // function and insert it into the cache.
1548   if (cache == NULL || !cache->Lookup(name, &function_info)) {
1549     ASSERT(source->IsOneByteRepresentation());
1550     Handle<String> script_name =
1551         factory->NewStringFromUtf8(name).ToHandleChecked();
1552     function_info = Compiler::CompileScript(
1553         source,
1554         script_name,
1555         0,
1556         0,
1557         false,
1558         top_context,
1559         extension,
1560         NULL,
1561         NO_CACHED_DATA,
1562         use_runtime_context ? NATIVES_CODE : NOT_NATIVES_CODE);
1563     if (function_info.is_null()) return false;
1564     if (cache != NULL) cache->Add(name, function_info);
1565   }
1566
1567   // Set up the function context. Conceptually, we should clone the
1568   // function before overwriting the context but since we're in a
1569   // single-threaded environment it is not strictly necessary.
1570   ASSERT(top_context->IsNativeContext());
1571   Handle<Context> context =
1572       Handle<Context>(use_runtime_context
1573                       ? Handle<Context>(top_context->runtime_context())
1574                       : top_context);
1575   Handle<JSFunction> fun =
1576       factory->NewFunctionFromSharedFunctionInfo(function_info, context);
1577
1578   // Call function using either the runtime object or the global
1579   // object as the receiver. Provide no parameters.
1580   Handle<Object> receiver =
1581       Handle<Object>(use_runtime_context
1582                      ? top_context->builtins()
1583                      : top_context->global_object(),
1584                      isolate);
1585   return !Execution::Call(
1586       isolate, fun, receiver, 0, NULL).is_null();
1587 }
1588
1589
1590 #define INSTALL_NATIVE(Type, name, var)                                        \
1591   Handle<String> var##_name =                                                  \
1592       factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR(name));          \
1593   Handle<Object> var##_native = Object::GetProperty(                           \
1594       handle(native_context()->builtins()), var##_name).ToHandleChecked();     \
1595   native_context()->set_##var(Type::cast(*var##_native));
1596
1597
1598 void Genesis::InstallNativeFunctions() {
1599   HandleScope scope(isolate());
1600   INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun);
1601
1602   INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun);
1603   INSTALL_NATIVE(JSFunction, "ToString", to_string_fun);
1604   INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun);
1605   INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun);
1606   INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun);
1607   INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun);
1608   INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun);
1609
1610   INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun);
1611   INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun);
1612   INSTALL_NATIVE(JSFunction, "ConfigureTemplateInstance",
1613                  configure_instance_fun);
1614   INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun);
1615   INSTALL_NATIVE(JSObject, "functionCache", function_cache);
1616   INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor",
1617                  to_complete_property_descriptor);
1618
1619   INSTALL_NATIVE(JSFunction, "IsPromise", is_promise);
1620   INSTALL_NATIVE(JSFunction, "PromiseCreate", promise_create);
1621   INSTALL_NATIVE(JSFunction, "PromiseResolve", promise_resolve);
1622   INSTALL_NATIVE(JSFunction, "PromiseReject", promise_reject);
1623   INSTALL_NATIVE(JSFunction, "PromiseChain", promise_chain);
1624   INSTALL_NATIVE(JSFunction, "PromiseCatch", promise_catch);
1625   INSTALL_NATIVE(JSFunction, "PromiseThen", promise_then);
1626
1627   INSTALL_NATIVE(JSFunction, "NotifyChange", observers_notify_change);
1628   INSTALL_NATIVE(JSFunction, "EnqueueSpliceRecord", observers_enqueue_splice);
1629   INSTALL_NATIVE(JSFunction, "BeginPerformSplice",
1630                  observers_begin_perform_splice);
1631   INSTALL_NATIVE(JSFunction, "EndPerformSplice",
1632                  observers_end_perform_splice);
1633   INSTALL_NATIVE(JSFunction, "NativeObjectObserve",
1634                  native_object_observe);
1635   INSTALL_NATIVE(JSFunction, "NativeObjectGetNotifier",
1636                  native_object_get_notifier);
1637   INSTALL_NATIVE(JSFunction, "NativeObjectNotifierPerformChange",
1638                  native_object_notifier_perform_change);
1639 }
1640
1641
1642 void Genesis::InstallExperimentalNativeFunctions() {
1643   if (FLAG_harmony_proxies) {
1644     INSTALL_NATIVE(JSFunction, "DerivedHasTrap", derived_has_trap);
1645     INSTALL_NATIVE(JSFunction, "DerivedGetTrap", derived_get_trap);
1646     INSTALL_NATIVE(JSFunction, "DerivedSetTrap", derived_set_trap);
1647     INSTALL_NATIVE(JSFunction, "ProxyEnumerate", proxy_enumerate);
1648   }
1649
1650   if (FLAG_harmony_symbols) {
1651     INSTALL_NATIVE(Symbol, "symbolIterator", iterator_symbol);
1652   }
1653 }
1654
1655 #undef INSTALL_NATIVE
1656
1657
1658 Handle<JSFunction> Genesis::InstallInternalArray(
1659     Handle<JSBuiltinsObject> builtins,
1660     const char* name,
1661     ElementsKind elements_kind) {
1662   // --- I n t e r n a l   A r r a y ---
1663   // An array constructor on the builtins object that works like
1664   // the public Array constructor, except that its prototype
1665   // doesn't inherit from Object.prototype.
1666   // To be used only for internal work by builtins. Instances
1667   // must not be leaked to user code.
1668   Handle<JSObject> prototype =
1669       factory()->NewJSObject(isolate()->object_function(), TENURED);
1670   Handle<JSFunction> array_function = InstallFunction(
1671       builtins, name, JS_ARRAY_TYPE, JSArray::kSize,
1672       prototype, Builtins::kInternalArrayCode);
1673
1674   InternalArrayConstructorStub internal_array_constructor_stub(isolate());
1675   Handle<Code> code = internal_array_constructor_stub.GetCode();
1676   array_function->shared()->set_construct_stub(*code);
1677   array_function->shared()->DontAdaptArguments();
1678
1679   Handle<Map> original_map(array_function->initial_map());
1680   Handle<Map> initial_map = Map::Copy(original_map);
1681   initial_map->set_elements_kind(elements_kind);
1682   array_function->set_initial_map(*initial_map);
1683
1684   // Make "length" magic on instances.
1685   Map::EnsureDescriptorSlack(initial_map, 1);
1686
1687   PropertyAttributes attribs = static_cast<PropertyAttributes>(
1688       DONT_ENUM | DONT_DELETE);
1689
1690   Handle<AccessorInfo> array_length =
1691       Accessors::ArrayLengthInfo(isolate(), attribs);
1692   {  // Add length.
1693     CallbacksDescriptor d(
1694         Handle<Name>(Name::cast(array_length->name())), array_length, attribs);
1695     array_function->initial_map()->AppendDescriptor(&d);
1696   }
1697
1698   return array_function;
1699 }
1700
1701
1702 bool Genesis::InstallNatives() {
1703   HandleScope scope(isolate());
1704
1705   // Create a function for the builtins object. Allocate space for the
1706   // JavaScript builtins, a reference to the builtins object
1707   // (itself) and a reference to the native_context directly in the object.
1708   Handle<Code> code = Handle<Code>(
1709       isolate()->builtins()->builtin(Builtins::kIllegal));
1710   Handle<JSFunction> builtins_fun = factory()->NewFunction(
1711       factory()->empty_string(), code, JS_BUILTINS_OBJECT_TYPE,
1712       JSBuiltinsObject::kSize);
1713
1714   Handle<String> name =
1715       factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins"));
1716   builtins_fun->shared()->set_instance_class_name(*name);
1717   builtins_fun->initial_map()->set_dictionary_map(true);
1718   builtins_fun->initial_map()->set_prototype(heap()->null_value());
1719
1720   // Allocate the builtins object.
1721   Handle<JSBuiltinsObject> builtins =
1722       Handle<JSBuiltinsObject>::cast(factory()->NewGlobalObject(builtins_fun));
1723   builtins->set_builtins(*builtins);
1724   builtins->set_native_context(*native_context());
1725   builtins->set_global_context(*native_context());
1726   builtins->set_global_receiver(*builtins);
1727   builtins->set_global_receiver(native_context()->global_proxy());
1728
1729
1730   // Set up the 'global' properties of the builtins object. The
1731   // 'global' property that refers to the global object is the only
1732   // way to get from code running in the builtins context to the
1733   // global object.
1734   static const PropertyAttributes attributes =
1735       static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
1736   Handle<String> global_string =
1737       factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("global"));
1738   Handle<Object> global_obj(native_context()->global_object(), isolate());
1739   JSObject::SetOwnPropertyIgnoreAttributes(
1740       builtins, global_string, global_obj, attributes).Check();
1741   Handle<String> builtins_string =
1742       factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins"));
1743   JSObject::SetOwnPropertyIgnoreAttributes(
1744       builtins, builtins_string, builtins, attributes).Check();
1745
1746   // Set up the reference from the global object to the builtins object.
1747   JSGlobalObject::cast(native_context()->global_object())->
1748       set_builtins(*builtins);
1749
1750   // Create a bridge function that has context in the native context.
1751   Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string());
1752   ASSERT(bridge->context() == *isolate()->native_context());
1753
1754   // Allocate the builtins context.
1755   Handle<Context> context =
1756     factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge);
1757   context->set_global_object(*builtins);  // override builtins global object
1758
1759   native_context()->set_runtime_context(*context);
1760
1761   {  // -- S c r i p t
1762     // Builtin functions for Script.
1763     Handle<JSFunction> script_fun = InstallFunction(
1764         builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
1765         isolate()->initial_object_prototype(), Builtins::kIllegal);
1766     Handle<JSObject> prototype =
1767         factory()->NewJSObject(isolate()->object_function(), TENURED);
1768     Accessors::FunctionSetPrototype(script_fun, prototype);
1769     native_context()->set_script_function(*script_fun);
1770
1771     Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
1772     Map::EnsureDescriptorSlack(script_map, 13);
1773
1774     PropertyAttributes attribs =
1775         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
1776
1777     Handle<AccessorInfo> script_column =
1778         Accessors::ScriptColumnOffsetInfo(isolate(), attribs);
1779     {
1780       CallbacksDescriptor d(Handle<Name>(Name::cast(script_column->name())),
1781                            script_column, attribs);
1782       script_map->AppendDescriptor(&d);
1783     }
1784
1785     Handle<AccessorInfo> script_id =
1786         Accessors::ScriptIdInfo(isolate(), attribs);
1787     {
1788       CallbacksDescriptor d(Handle<Name>(Name::cast(script_id->name())),
1789                             script_id, attribs);
1790       script_map->AppendDescriptor(&d);
1791     }
1792
1793
1794     Handle<AccessorInfo> script_name =
1795         Accessors::ScriptNameInfo(isolate(), attribs);
1796     {
1797       CallbacksDescriptor d(Handle<Name>(Name::cast(script_name->name())),
1798                             script_name, attribs);
1799       script_map->AppendDescriptor(&d);
1800     }
1801
1802     Handle<AccessorInfo> script_line =
1803         Accessors::ScriptLineOffsetInfo(isolate(), attribs);
1804     {
1805       CallbacksDescriptor d(Handle<Name>(Name::cast(script_line->name())),
1806                            script_line, attribs);
1807       script_map->AppendDescriptor(&d);
1808     }
1809
1810     Handle<AccessorInfo> script_source =
1811         Accessors::ScriptSourceInfo(isolate(), attribs);
1812     {
1813       CallbacksDescriptor d(Handle<Name>(Name::cast(script_source->name())),
1814                             script_source, attribs);
1815       script_map->AppendDescriptor(&d);
1816     }
1817
1818     Handle<AccessorInfo> script_type =
1819         Accessors::ScriptTypeInfo(isolate(), attribs);
1820     {
1821       CallbacksDescriptor d(Handle<Name>(Name::cast(script_type->name())),
1822                             script_type, attribs);
1823       script_map->AppendDescriptor(&d);
1824     }
1825
1826     Handle<AccessorInfo> script_compilation_type =
1827         Accessors::ScriptCompilationTypeInfo(isolate(), attribs);
1828     {
1829       CallbacksDescriptor d(
1830           Handle<Name>(Name::cast(script_compilation_type->name())),
1831           script_compilation_type, attribs);
1832       script_map->AppendDescriptor(&d);
1833     }
1834
1835     Handle<AccessorInfo> script_line_ends =
1836         Accessors::ScriptLineEndsInfo(isolate(), attribs);
1837     {
1838       CallbacksDescriptor d(Handle<Name>(Name::cast(script_line_ends->name())),
1839                             script_line_ends, attribs);
1840       script_map->AppendDescriptor(&d);
1841     }
1842
1843     Handle<AccessorInfo> script_context_data =
1844         Accessors::ScriptContextDataInfo(isolate(), attribs);
1845     {
1846       CallbacksDescriptor d(
1847           Handle<Name>(Name::cast(script_context_data->name())),
1848           script_context_data, attribs);
1849       script_map->AppendDescriptor(&d);
1850     }
1851
1852     Handle<AccessorInfo> script_eval_from_script =
1853         Accessors::ScriptEvalFromScriptInfo(isolate(), attribs);
1854     {
1855       CallbacksDescriptor d(
1856           Handle<Name>(Name::cast(script_eval_from_script->name())),
1857           script_eval_from_script, attribs);
1858       script_map->AppendDescriptor(&d);
1859     }
1860
1861     Handle<AccessorInfo> script_eval_from_script_position =
1862         Accessors::ScriptEvalFromScriptPositionInfo(isolate(), attribs);
1863     {
1864       CallbacksDescriptor d(
1865           Handle<Name>(Name::cast(script_eval_from_script_position->name())),
1866           script_eval_from_script_position, attribs);
1867       script_map->AppendDescriptor(&d);
1868     }
1869
1870     Handle<AccessorInfo> script_eval_from_function_name =
1871         Accessors::ScriptEvalFromFunctionNameInfo(isolate(), attribs);
1872     {
1873       CallbacksDescriptor d(
1874           Handle<Name>(Name::cast(script_eval_from_function_name->name())),
1875           script_eval_from_function_name, attribs);
1876       script_map->AppendDescriptor(&d);
1877     }
1878
1879     // Allocate the empty script.
1880     Handle<Script> script = factory()->NewScript(factory()->empty_string());
1881     script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
1882     heap()->public_set_empty_script(*script);
1883   }
1884   {
1885     // Builtin function for OpaqueReference -- a JSValue-based object,
1886     // that keeps its field isolated from JavaScript code. It may store
1887     // objects, that JavaScript code may not access.
1888     Handle<JSFunction> opaque_reference_fun = InstallFunction(
1889         builtins, "OpaqueReference", JS_VALUE_TYPE, JSValue::kSize,
1890         isolate()->initial_object_prototype(), Builtins::kIllegal);
1891     Handle<JSObject> prototype =
1892         factory()->NewJSObject(isolate()->object_function(), TENURED);
1893     Accessors::FunctionSetPrototype(opaque_reference_fun, prototype);
1894     native_context()->set_opaque_reference_function(*opaque_reference_fun);
1895   }
1896
1897   // InternalArrays should not use Smi-Only array optimizations. There are too
1898   // many places in the C++ runtime code (e.g. RegEx) that assume that
1899   // elements in InternalArrays can be set to non-Smi values without going
1900   // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
1901   // transition easy to trap. Moreover, they rarely are smi-only.
1902   {
1903     Handle<JSFunction> array_function =
1904         InstallInternalArray(builtins, "InternalArray", FAST_HOLEY_ELEMENTS);
1905     native_context()->set_internal_array_function(*array_function);
1906   }
1907
1908   {
1909     InstallInternalArray(builtins, "InternalPackedArray", FAST_ELEMENTS);
1910   }
1911
1912   if (FLAG_disable_native_files) {
1913     PrintF("Warning: Running without installed natives!\n");
1914     return true;
1915   }
1916
1917   // Install natives.
1918   for (int i = Natives::GetDebuggerCount();
1919        i < Natives::GetBuiltinsCount();
1920        i++) {
1921     if (!CompileBuiltin(isolate(), i)) return false;
1922     // TODO(ager): We really only need to install the JS builtin
1923     // functions on the builtins object after compiling and running
1924     // runtime.js.
1925     if (!InstallJSBuiltins(builtins)) return false;
1926   }
1927
1928   InstallNativeFunctions();
1929
1930   // Store the map for the string prototype after the natives has been compiled
1931   // and the String function has been set up.
1932   Handle<JSFunction> string_function(native_context()->string_function());
1933   ASSERT(JSObject::cast(
1934       string_function->initial_map()->prototype())->HasFastProperties());
1935   native_context()->set_string_function_prototype_map(
1936       HeapObject::cast(string_function->initial_map()->prototype())->map());
1937
1938   // Install Function.prototype.call and apply.
1939   { Handle<String> key = factory()->function_class_string();
1940     Handle<JSFunction> function =
1941         Handle<JSFunction>::cast(Object::GetProperty(
1942             isolate()->global_object(), key).ToHandleChecked());
1943     Handle<JSObject> proto =
1944         Handle<JSObject>(JSObject::cast(function->instance_prototype()));
1945
1946     // Install the call and the apply functions.
1947     Handle<JSFunction> call =
1948         InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1949                         MaybeHandle<JSObject>(), Builtins::kFunctionCall);
1950     Handle<JSFunction> apply =
1951         InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1952                         MaybeHandle<JSObject>(), Builtins::kFunctionApply);
1953
1954     // Make sure that Function.prototype.call appears to be compiled.
1955     // The code will never be called, but inline caching for call will
1956     // only work if it appears to be compiled.
1957     call->shared()->DontAdaptArguments();
1958     ASSERT(call->is_compiled());
1959
1960     // Set the expected parameters for apply to 2; required by builtin.
1961     apply->shared()->set_formal_parameter_count(2);
1962
1963     // Set the lengths for the functions to satisfy ECMA-262.
1964     call->shared()->set_length(1);
1965     apply->shared()->set_length(2);
1966   }
1967
1968   InstallBuiltinFunctionIds();
1969
1970   // Create a constructor for RegExp results (a variant of Array that
1971   // predefines the two properties index and match).
1972   {
1973     // RegExpResult initial map.
1974
1975     // Find global.Array.prototype to inherit from.
1976     Handle<JSFunction> array_constructor(native_context()->array_function());
1977     Handle<JSObject> array_prototype(
1978         JSObject::cast(array_constructor->instance_prototype()));
1979
1980     // Add initial map.
1981     Handle<Map> initial_map =
1982         factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize);
1983     initial_map->set_constructor(*array_constructor);
1984
1985     // Set prototype on map.
1986     initial_map->set_non_instance_prototype(false);
1987     initial_map->set_prototype(*array_prototype);
1988
1989     // Update map with length accessor from Array and add "index" and "input".
1990     Map::EnsureDescriptorSlack(initial_map, 3);
1991
1992     {
1993       JSFunction* array_function = native_context()->array_function();
1994       Handle<DescriptorArray> array_descriptors(
1995           array_function->initial_map()->instance_descriptors());
1996       Handle<String> length = factory()->length_string();
1997       int old = array_descriptors->SearchWithCache(
1998           *length, array_function->initial_map());
1999       ASSERT(old != DescriptorArray::kNotFound);
2000       CallbacksDescriptor desc(length,
2001                                handle(array_descriptors->GetValue(old),
2002                                       isolate()),
2003                                array_descriptors->GetDetails(old).attributes());
2004       initial_map->AppendDescriptor(&desc);
2005     }
2006     {
2007       FieldDescriptor index_field(factory()->index_string(),
2008                                   JSRegExpResult::kIndexIndex,
2009                                   NONE,
2010                                   Representation::Tagged());
2011       initial_map->AppendDescriptor(&index_field);
2012     }
2013
2014     {
2015       FieldDescriptor input_field(factory()->input_string(),
2016                                   JSRegExpResult::kInputIndex,
2017                                   NONE,
2018                                   Representation::Tagged());
2019       initial_map->AppendDescriptor(&input_field);
2020     }
2021
2022     initial_map->set_inobject_properties(2);
2023     initial_map->set_pre_allocated_property_fields(2);
2024     initial_map->set_unused_property_fields(0);
2025
2026     native_context()->set_regexp_result_map(*initial_map);
2027   }
2028
2029 #ifdef VERIFY_HEAP
2030   builtins->ObjectVerify();
2031 #endif
2032
2033   return true;
2034 }
2035
2036
2037 #define INSTALL_EXPERIMENTAL_NATIVE(i, flag, file)                \
2038   if (FLAG_harmony_##flag &&                                      \
2039       strcmp(ExperimentalNatives::GetScriptName(i).start(),       \
2040           "native " file) == 0) {                                 \
2041     if (!CompileExperimentalBuiltin(isolate(), i)) return false;  \
2042   }
2043
2044
2045 bool Genesis::InstallExperimentalNatives() {
2046   for (int i = ExperimentalNatives::GetDebuggerCount();
2047        i < ExperimentalNatives::GetBuiltinsCount();
2048        i++) {
2049     INSTALL_EXPERIMENTAL_NATIVE(i, symbols, "symbol.js")
2050     INSTALL_EXPERIMENTAL_NATIVE(i, proxies, "proxy.js")
2051     INSTALL_EXPERIMENTAL_NATIVE(i, collections, "collection.js")
2052     INSTALL_EXPERIMENTAL_NATIVE(i, collections, "collection-iterator.js")
2053     INSTALL_EXPERIMENTAL_NATIVE(i, generators, "generator.js")
2054     INSTALL_EXPERIMENTAL_NATIVE(i, iteration, "array-iterator.js")
2055     INSTALL_EXPERIMENTAL_NATIVE(i, strings, "harmony-string.js")
2056     INSTALL_EXPERIMENTAL_NATIVE(i, arrays, "harmony-array.js")
2057     INSTALL_EXPERIMENTAL_NATIVE(i, maths, "harmony-math.js")
2058   }
2059
2060   InstallExperimentalNativeFunctions();
2061   InstallExperimentalBuiltinFunctionIds();
2062   return true;
2063 }
2064
2065
2066 static Handle<JSObject> ResolveBuiltinIdHolder(
2067     Handle<Context> native_context,
2068     const char* holder_expr) {
2069   Isolate* isolate = native_context->GetIsolate();
2070   Factory* factory = isolate->factory();
2071   Handle<GlobalObject> global(native_context->global_object());
2072   const char* period_pos = strchr(holder_expr, '.');
2073   if (period_pos == NULL) {
2074     return Handle<JSObject>::cast(Object::GetPropertyOrElement(
2075         global, factory->InternalizeUtf8String(holder_expr)).ToHandleChecked());
2076   }
2077   ASSERT_EQ(".prototype", period_pos);
2078   Vector<const char> property(holder_expr,
2079                               static_cast<int>(period_pos - holder_expr));
2080   Handle<String> property_string = factory->InternalizeUtf8String(property);
2081   ASSERT(!property_string.is_null());
2082   Handle<JSFunction> function = Handle<JSFunction>::cast(
2083       Object::GetProperty(global, property_string).ToHandleChecked());
2084   return Handle<JSObject>(JSObject::cast(function->prototype()));
2085 }
2086
2087
2088 static void InstallBuiltinFunctionId(Handle<JSObject> holder,
2089                                      const char* function_name,
2090                                      BuiltinFunctionId id) {
2091   Isolate* isolate = holder->GetIsolate();
2092   Handle<Object> function_object =
2093       Object::GetProperty(isolate, holder, function_name).ToHandleChecked();
2094   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
2095   function->shared()->set_function_data(Smi::FromInt(id));
2096 }
2097
2098
2099 void Genesis::InstallBuiltinFunctionIds() {
2100   HandleScope scope(isolate());
2101 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \
2102   {                                                     \
2103     Handle<JSObject> holder = ResolveBuiltinIdHolder(   \
2104         native_context(), #holder_expr);                \
2105     BuiltinFunctionId id = k##name;                     \
2106     InstallBuiltinFunctionId(holder, #fun_name, id);    \
2107   }
2108   FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)
2109 #undef INSTALL_BUILTIN_ID
2110 }
2111
2112
2113 void Genesis::InstallExperimentalBuiltinFunctionIds() {
2114   HandleScope scope(isolate());
2115   if (FLAG_harmony_maths) {
2116     Handle<JSObject> holder = ResolveBuiltinIdHolder(native_context(), "Math");
2117     InstallBuiltinFunctionId(holder, "clz32", kMathClz32);
2118   }
2119 }
2120
2121
2122 // Do not forget to update macros.py with named constant
2123 // of cache id.
2124 #define JSFUNCTION_RESULT_CACHE_LIST(F) \
2125   F(16, native_context()->regexp_function())
2126
2127
2128 static FixedArray* CreateCache(int size, Handle<JSFunction> factory_function) {
2129   Factory* factory = factory_function->GetIsolate()->factory();
2130   // Caches are supposed to live for a long time, allocate in old space.
2131   int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size;
2132   // Cannot use cast as object is not fully initialized yet.
2133   JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>(
2134       *factory->NewFixedArrayWithHoles(array_size, TENURED));
2135   cache->set(JSFunctionResultCache::kFactoryIndex, *factory_function);
2136   cache->MakeZeroSize();
2137   return cache;
2138 }
2139
2140
2141 void Genesis::InstallJSFunctionResultCaches() {
2142   const int kNumberOfCaches = 0 +
2143 #define F(size, func) + 1
2144     JSFUNCTION_RESULT_CACHE_LIST(F)
2145 #undef F
2146   ;
2147
2148   Handle<FixedArray> caches =
2149       factory()->NewFixedArray(kNumberOfCaches, TENURED);
2150
2151   int index = 0;
2152
2153 #define F(size, func) do {                                              \
2154     FixedArray* cache = CreateCache((size), Handle<JSFunction>(func));  \
2155     caches->set(index++, cache);                                        \
2156   } while (false)
2157
2158   JSFUNCTION_RESULT_CACHE_LIST(F);
2159
2160 #undef F
2161
2162   native_context()->set_jsfunction_result_caches(*caches);
2163 }
2164
2165
2166 void Genesis::InitializeNormalizedMapCaches() {
2167   Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate());
2168   native_context()->set_normalized_map_cache(*cache);
2169 }
2170
2171
2172 bool Bootstrapper::InstallExtensions(Handle<Context> native_context,
2173                                      v8::ExtensionConfiguration* extensions) {
2174   BootstrapperActive active(this);
2175   SaveContext saved_context(isolate_);
2176   isolate_->set_context(*native_context);
2177   return Genesis::InstallExtensions(native_context, extensions) &&
2178       Genesis::InstallSpecialObjects(native_context);
2179 }
2180
2181
2182 bool Genesis::InstallSpecialObjects(Handle<Context> native_context) {
2183   Isolate* isolate = native_context->GetIsolate();
2184   Factory* factory = isolate->factory();
2185   HandleScope scope(isolate);
2186   Handle<JSGlobalObject> global(JSGlobalObject::cast(
2187       native_context->global_object()));
2188   // Expose the natives in global if a name for it is specified.
2189   if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
2190     Handle<String> natives =
2191         factory->InternalizeUtf8String(FLAG_expose_natives_as);
2192     RETURN_ON_EXCEPTION_VALUE(
2193         isolate,
2194         JSObject::SetOwnPropertyIgnoreAttributes(
2195             global, natives, Handle<JSObject>(global->builtins()), DONT_ENUM),
2196         false);
2197   }
2198
2199   Handle<Object> Error = Object::GetProperty(
2200       isolate, global, "Error").ToHandleChecked();
2201   if (Error->IsJSObject()) {
2202     Handle<String> name = factory->InternalizeOneByteString(
2203         STATIC_ASCII_VECTOR("stackTraceLimit"));
2204     Handle<Smi> stack_trace_limit(
2205         Smi::FromInt(FLAG_stack_trace_limit), isolate);
2206     RETURN_ON_EXCEPTION_VALUE(
2207         isolate,
2208         JSObject::SetOwnPropertyIgnoreAttributes(
2209             Handle<JSObject>::cast(Error), name, stack_trace_limit, NONE),
2210         false);
2211   }
2212
2213   // Expose the debug global object in global if a name for it is specified.
2214   if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
2215     // If loading fails we just bail out without installing the
2216     // debugger but without tanking the whole context.
2217     Debug* debug = isolate->debug();
2218     if (!debug->Load()) return true;
2219     Handle<Context> debug_context = debug->debug_context();
2220     // Set the security token for the debugger context to the same as
2221     // the shell native context to allow calling between these (otherwise
2222     // exposing debug global object doesn't make much sense).
2223     debug_context->set_security_token(native_context->security_token());
2224     Handle<String> debug_string =
2225         factory->InternalizeUtf8String(FLAG_expose_debug_as);
2226     Handle<Object> global_proxy(debug_context->global_proxy(), isolate);
2227     RETURN_ON_EXCEPTION_VALUE(
2228         isolate,
2229         JSObject::SetOwnPropertyIgnoreAttributes(
2230             global, debug_string, global_proxy, DONT_ENUM),
2231         false);
2232   }
2233   return true;
2234 }
2235
2236
2237 static uint32_t Hash(RegisteredExtension* extension) {
2238   return v8::internal::ComputePointerHash(extension);
2239 }
2240
2241
2242 Genesis::ExtensionStates::ExtensionStates() : map_(HashMap::PointersMatch, 8) {}
2243
2244 Genesis::ExtensionTraversalState Genesis::ExtensionStates::get_state(
2245     RegisteredExtension* extension) {
2246   i::HashMap::Entry* entry = map_.Lookup(extension, Hash(extension), false);
2247   if (entry == NULL) {
2248     return UNVISITED;
2249   }
2250   return static_cast<ExtensionTraversalState>(
2251       reinterpret_cast<intptr_t>(entry->value));
2252 }
2253
2254 void Genesis::ExtensionStates::set_state(RegisteredExtension* extension,
2255                                          ExtensionTraversalState state) {
2256   map_.Lookup(extension, Hash(extension), true)->value =
2257       reinterpret_cast<void*>(static_cast<intptr_t>(state));
2258 }
2259
2260
2261 bool Genesis::InstallExtensions(Handle<Context> native_context,
2262                                 v8::ExtensionConfiguration* extensions) {
2263   Isolate* isolate = native_context->GetIsolate();
2264   ExtensionStates extension_states;  // All extensions have state UNVISITED.
2265   return InstallAutoExtensions(isolate, &extension_states) &&
2266       (!FLAG_expose_free_buffer ||
2267        InstallExtension(isolate, "v8/free-buffer", &extension_states)) &&
2268       (!FLAG_expose_gc ||
2269        InstallExtension(isolate, "v8/gc", &extension_states)) &&
2270       (!FLAG_expose_externalize_string ||
2271        InstallExtension(isolate, "v8/externalize", &extension_states)) &&
2272       (!FLAG_track_gc_object_stats ||
2273        InstallExtension(isolate, "v8/statistics", &extension_states)) &&
2274       (!FLAG_expose_trigger_failure ||
2275        InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
2276       InstallRequestedExtensions(isolate, extensions, &extension_states);
2277 }
2278
2279
2280 bool Genesis::InstallAutoExtensions(Isolate* isolate,
2281                                     ExtensionStates* extension_states) {
2282   for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
2283        it != NULL;
2284        it = it->next()) {
2285     if (it->extension()->auto_enable() &&
2286         !InstallExtension(isolate, it, extension_states)) {
2287       return false;
2288     }
2289   }
2290   return true;
2291 }
2292
2293
2294 bool Genesis::InstallRequestedExtensions(Isolate* isolate,
2295                                          v8::ExtensionConfiguration* extensions,
2296                                          ExtensionStates* extension_states) {
2297   for (const char** it = extensions->begin(); it != extensions->end(); ++it) {
2298     if (!InstallExtension(isolate, *it, extension_states)) return false;
2299   }
2300   return true;
2301 }
2302
2303
2304 // Installs a named extension.  This methods is unoptimized and does
2305 // not scale well if we want to support a large number of extensions.
2306 bool Genesis::InstallExtension(Isolate* isolate,
2307                                const char* name,
2308                                ExtensionStates* extension_states) {
2309   for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
2310        it != NULL;
2311        it = it->next()) {
2312     if (strcmp(name, it->extension()->name()) == 0) {
2313       return InstallExtension(isolate, it, extension_states);
2314     }
2315   }
2316   return Utils::ApiCheck(false,
2317                          "v8::Context::New()",
2318                          "Cannot find required extension");
2319 }
2320
2321
2322 bool Genesis::InstallExtension(Isolate* isolate,
2323                                v8::RegisteredExtension* current,
2324                                ExtensionStates* extension_states) {
2325   HandleScope scope(isolate);
2326
2327   if (extension_states->get_state(current) == INSTALLED) return true;
2328   // The current node has already been visited so there must be a
2329   // cycle in the dependency graph; fail.
2330   if (!Utils::ApiCheck(extension_states->get_state(current) != VISITED,
2331                        "v8::Context::New()",
2332                        "Circular extension dependency")) {
2333     return false;
2334   }
2335   ASSERT(extension_states->get_state(current) == UNVISITED);
2336   extension_states->set_state(current, VISITED);
2337   v8::Extension* extension = current->extension();
2338   // Install the extension's dependencies
2339   for (int i = 0; i < extension->dependency_count(); i++) {
2340     if (!InstallExtension(isolate,
2341                           extension->dependencies()[i],
2342                           extension_states)) {
2343       return false;
2344     }
2345   }
2346   // We do not expect this to throw an exception. Change this if it does.
2347   Handle<String> source_code =
2348       isolate->factory()->NewExternalStringFromAscii(
2349           extension->source()).ToHandleChecked();
2350   bool result = CompileScriptCached(isolate,
2351                                     CStrVector(extension->name()),
2352                                     source_code,
2353                                     isolate->bootstrapper()->extensions_cache(),
2354                                     extension,
2355                                     Handle<Context>(isolate->context()),
2356                                     false);
2357   ASSERT(isolate->has_pending_exception() != result);
2358   if (!result) {
2359     // We print out the name of the extension that fail to install.
2360     // When an error is thrown during bootstrapping we automatically print
2361     // the line number at which this happened to the console in the isolate
2362     // error throwing functionality.
2363     OS::PrintError("Error installing extension '%s'.\n",
2364                    current->extension()->name());
2365     isolate->clear_pending_exception();
2366   }
2367   extension_states->set_state(current, INSTALLED);
2368   isolate->NotifyExtensionInstalled();
2369   return result;
2370 }
2371
2372
2373 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) {
2374   HandleScope scope(isolate());
2375   for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) {
2376     Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i);
2377     Handle<Object> function_object = Object::GetProperty(
2378         isolate(), builtins, Builtins::GetName(id)).ToHandleChecked();
2379     Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
2380     builtins->set_javascript_builtin(id, *function);
2381     if (!Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) {
2382       return false;
2383     }
2384     builtins->set_javascript_builtin_code(id, function->shared()->code());
2385   }
2386   return true;
2387 }
2388
2389
2390 bool Genesis::ConfigureGlobalObjects(
2391     v8::Handle<v8::ObjectTemplate> global_proxy_template) {
2392   Handle<JSObject> global_proxy(
2393       JSObject::cast(native_context()->global_proxy()));
2394   Handle<JSObject> inner_global(
2395       JSObject::cast(native_context()->global_object()));
2396
2397   if (!global_proxy_template.IsEmpty()) {
2398     // Configure the global proxy object.
2399     Handle<ObjectTemplateInfo> proxy_data =
2400         v8::Utils::OpenHandle(*global_proxy_template);
2401     if (!ConfigureApiObject(global_proxy, proxy_data)) return false;
2402
2403     // Configure the inner global object.
2404     Handle<FunctionTemplateInfo> proxy_constructor(
2405         FunctionTemplateInfo::cast(proxy_data->constructor()));
2406     if (!proxy_constructor->prototype_template()->IsUndefined()) {
2407       Handle<ObjectTemplateInfo> inner_data(
2408           ObjectTemplateInfo::cast(proxy_constructor->prototype_template()));
2409       if (!ConfigureApiObject(inner_global, inner_data)) return false;
2410     }
2411   }
2412
2413   SetObjectPrototype(global_proxy, inner_global);
2414
2415   native_context()->set_initial_array_prototype(
2416       JSArray::cast(native_context()->array_function()->prototype()));
2417
2418   return true;
2419 }
2420
2421
2422 bool Genesis::ConfigureApiObject(Handle<JSObject> object,
2423     Handle<ObjectTemplateInfo> object_template) {
2424   ASSERT(!object_template.is_null());
2425   ASSERT(FunctionTemplateInfo::cast(object_template->constructor())
2426              ->IsTemplateFor(object->map()));;
2427
2428   MaybeHandle<JSObject> maybe_obj =
2429       Execution::InstantiateObject(object_template);
2430   Handle<JSObject> obj;
2431   if (!maybe_obj.ToHandle(&obj)) {
2432     ASSERT(isolate()->has_pending_exception());
2433     isolate()->clear_pending_exception();
2434     return false;
2435   }
2436   TransferObject(obj, object);
2437   return true;
2438 }
2439
2440
2441 void Genesis::TransferNamedProperties(Handle<JSObject> from,
2442                                       Handle<JSObject> to) {
2443   if (from->HasFastProperties()) {
2444     Handle<DescriptorArray> descs =
2445         Handle<DescriptorArray>(from->map()->instance_descriptors());
2446     for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) {
2447       PropertyDetails details = descs->GetDetails(i);
2448       switch (details.type()) {
2449         case FIELD: {
2450           HandleScope inner(isolate());
2451           Handle<Name> key = Handle<Name>(descs->GetKey(i));
2452           FieldIndex index = FieldIndex::ForDescriptor(from->map(), i);
2453           ASSERT(!descs->GetDetails(i).representation().IsDouble());
2454           Handle<Object> value = Handle<Object>(from->RawFastPropertyAt(index),
2455                                                 isolate());
2456           JSObject::SetOwnPropertyIgnoreAttributes(
2457               to, key, value, details.attributes()).Check();
2458           break;
2459         }
2460         case CONSTANT: {
2461           HandleScope inner(isolate());
2462           Handle<Name> key = Handle<Name>(descs->GetKey(i));
2463           Handle<Object> constant(descs->GetConstant(i), isolate());
2464           JSObject::SetOwnPropertyIgnoreAttributes(
2465               to, key, constant, details.attributes()).Check();
2466           break;
2467         }
2468         case CALLBACKS: {
2469           LookupResult result(isolate());
2470           Handle<Name> key(Name::cast(descs->GetKey(i)), isolate());
2471           to->LookupOwn(key, &result);
2472           // If the property is already there we skip it
2473           if (result.IsFound()) continue;
2474           HandleScope inner(isolate());
2475           ASSERT(!to->HasFastProperties());
2476           // Add to dictionary.
2477           Handle<Object> callbacks(descs->GetCallbacksObject(i), isolate());
2478           PropertyDetails d = PropertyDetails(
2479               details.attributes(), CALLBACKS, i + 1);
2480           JSObject::SetNormalizedProperty(to, key, callbacks, d);
2481           break;
2482         }
2483         case NORMAL:
2484           // Do not occur since the from object has fast properties.
2485         case HANDLER:
2486         case INTERCEPTOR:
2487         case NONEXISTENT:
2488           // No element in instance descriptors have proxy or interceptor type.
2489           UNREACHABLE();
2490           break;
2491       }
2492     }
2493   } else {
2494     Handle<NameDictionary> properties =
2495         Handle<NameDictionary>(from->property_dictionary());
2496     int capacity = properties->Capacity();
2497     for (int i = 0; i < capacity; i++) {
2498       Object* raw_key(properties->KeyAt(i));
2499       if (properties->IsKey(raw_key)) {
2500         ASSERT(raw_key->IsName());
2501         // If the property is already there we skip it.
2502         LookupResult result(isolate());
2503         Handle<Name> key(Name::cast(raw_key));
2504         to->LookupOwn(key, &result);
2505         if (result.IsFound()) continue;
2506         // Set the property.
2507         Handle<Object> value = Handle<Object>(properties->ValueAt(i),
2508                                               isolate());
2509         ASSERT(!value->IsCell());
2510         if (value->IsPropertyCell()) {
2511           value = Handle<Object>(PropertyCell::cast(*value)->value(),
2512                                  isolate());
2513         }
2514         PropertyDetails details = properties->DetailsAt(i);
2515         JSObject::SetOwnPropertyIgnoreAttributes(
2516             to, key, value, details.attributes()).Check();
2517       }
2518     }
2519   }
2520 }
2521
2522
2523 void Genesis::TransferIndexedProperties(Handle<JSObject> from,
2524                                         Handle<JSObject> to) {
2525   // Cloning the elements array is sufficient.
2526   Handle<FixedArray> from_elements =
2527       Handle<FixedArray>(FixedArray::cast(from->elements()));
2528   Handle<FixedArray> to_elements = factory()->CopyFixedArray(from_elements);
2529   to->set_elements(*to_elements);
2530 }
2531
2532
2533 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
2534   HandleScope outer(isolate());
2535
2536   ASSERT(!from->IsJSArray());
2537   ASSERT(!to->IsJSArray());
2538
2539   TransferNamedProperties(from, to);
2540   TransferIndexedProperties(from, to);
2541
2542   // Transfer the prototype (new map is needed).
2543   Handle<Map> old_to_map = Handle<Map>(to->map());
2544   Handle<Map> new_to_map = Map::Copy(old_to_map);
2545   new_to_map->set_prototype(from->map()->prototype());
2546   to->set_map(*new_to_map);
2547 }
2548
2549
2550 void Genesis::MakeFunctionInstancePrototypeWritable() {
2551   // The maps with writable prototype are created in CreateEmptyFunction
2552   // and CreateStrictModeFunctionMaps respectively. Initially the maps are
2553   // created with read-only prototype for JS builtins processing.
2554   ASSERT(!sloppy_function_map_writable_prototype_.is_null());
2555   ASSERT(!strict_function_map_writable_prototype_.is_null());
2556
2557   // Replace function instance maps to make prototype writable.
2558   native_context()->set_sloppy_function_map(
2559       *sloppy_function_map_writable_prototype_);
2560   native_context()->set_strict_function_map(
2561       *strict_function_map_writable_prototype_);
2562 }
2563
2564
2565 class NoTrackDoubleFieldsForSerializerScope {
2566  public:
2567   explicit NoTrackDoubleFieldsForSerializerScope(Isolate* isolate)
2568       : flag_(FLAG_track_double_fields) {
2569     if (isolate->serializer_enabled()) {
2570       // Disable tracking double fields because heap numbers treated as
2571       // immutable by the serializer.
2572       FLAG_track_double_fields = false;
2573     }
2574   }
2575
2576   ~NoTrackDoubleFieldsForSerializerScope() {
2577     FLAG_track_double_fields = flag_;
2578   }
2579
2580  private:
2581   bool flag_;
2582 };
2583
2584
2585 Genesis::Genesis(Isolate* isolate,
2586                  Handle<Object> global_object,
2587                  v8::Handle<v8::ObjectTemplate> global_template,
2588                  v8::ExtensionConfiguration* extensions)
2589     : isolate_(isolate),
2590       active_(isolate->bootstrapper()) {
2591   NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
2592   result_ = Handle<Context>::null();
2593   // If V8 cannot be initialized, just return.
2594   if (!V8::Initialize(NULL)) return;
2595
2596   // Before creating the roots we must save the context and restore it
2597   // on all function exits.
2598   SaveContext saved_context(isolate);
2599
2600   // During genesis, the boilerplate for stack overflow won't work until the
2601   // environment has been at least partially initialized. Add a stack check
2602   // before entering JS code to catch overflow early.
2603   StackLimitCheck check(isolate);
2604   if (check.HasOverflowed()) return;
2605
2606   // We can only de-serialize a context if the isolate was initialized from
2607   // a snapshot. Otherwise we have to build the context from scratch.
2608   if (isolate->initialized_from_snapshot()) {
2609     native_context_ = Snapshot::NewContextFromSnapshot(isolate);
2610   } else {
2611     native_context_ = Handle<Context>();
2612   }
2613
2614   if (!native_context().is_null()) {
2615     AddToWeakNativeContextList(*native_context());
2616     isolate->set_context(*native_context());
2617     isolate->counters()->contexts_created_by_snapshot()->Increment();
2618     Handle<GlobalObject> inner_global;
2619     Handle<JSGlobalProxy> global_proxy =
2620         CreateNewGlobals(global_template,
2621                          global_object,
2622                          &inner_global);
2623
2624     HookUpGlobalProxy(inner_global, global_proxy);
2625     HookUpInnerGlobal(inner_global);
2626     native_context()->builtins()->set_global_receiver(
2627         native_context()->global_proxy());
2628
2629     if (!ConfigureGlobalObjects(global_template)) return;
2630   } else {
2631     // We get here if there was no context snapshot.
2632     CreateRoots();
2633     Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
2634     CreateStrictModeFunctionMaps(empty_function);
2635     Handle<GlobalObject> inner_global;
2636     Handle<JSGlobalProxy> global_proxy =
2637         CreateNewGlobals(global_template, global_object, &inner_global);
2638     HookUpGlobalProxy(inner_global, global_proxy);
2639     InitializeGlobal(inner_global, empty_function);
2640     InstallJSFunctionResultCaches();
2641     InitializeNormalizedMapCaches();
2642     if (!InstallNatives()) return;
2643
2644     MakeFunctionInstancePrototypeWritable();
2645
2646     if (!ConfigureGlobalObjects(global_template)) return;
2647     isolate->counters()->contexts_created_from_scratch()->Increment();
2648   }
2649
2650   // Initialize experimental globals and install experimental natives.
2651   InitializeExperimentalGlobal();
2652   if (!InstallExperimentalNatives()) return;
2653
2654   // We can't (de-)serialize typed arrays currently, but we are lucky: The state
2655   // of the random number generator needs no initialization during snapshot
2656   // creation time and we don't need trigonometric functions then.
2657   if (!isolate->serializer_enabled()) {
2658     // Initially seed the per-context random number generator using the
2659     // per-isolate random number generator.
2660     const int num_elems = 2;
2661     const int num_bytes = num_elems * sizeof(uint32_t);
2662     uint32_t* state = reinterpret_cast<uint32_t*>(malloc(num_bytes));
2663
2664     do {
2665       isolate->random_number_generator()->NextBytes(state, num_bytes);
2666     } while (state[0] == 0 || state[1] == 0);
2667
2668     v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(
2669         reinterpret_cast<v8::Isolate*>(isolate), state, num_bytes);
2670     Utils::OpenHandle(*buffer)->set_should_be_freed(true);
2671     v8::Local<v8::Uint32Array> ta = v8::Uint32Array::New(buffer, 0, num_elems);
2672     Handle<JSBuiltinsObject> builtins(native_context()->builtins());
2673     Runtime::ForceSetObjectProperty(builtins,
2674                                     factory()->InternalizeOneByteString(
2675                                         STATIC_ASCII_VECTOR("rngstate")),
2676                                     Utils::OpenHandle(*ta),
2677                                     NONE).Assert();
2678
2679     // Initialize trigonometric lookup tables and constants.
2680     const int table_num_bytes = TrigonometricLookupTable::table_num_bytes();
2681     v8::Local<v8::ArrayBuffer> sin_buffer = v8::ArrayBuffer::New(
2682         reinterpret_cast<v8::Isolate*>(isolate),
2683         TrigonometricLookupTable::sin_table(), table_num_bytes);
2684     v8::Local<v8::ArrayBuffer> cos_buffer = v8::ArrayBuffer::New(
2685         reinterpret_cast<v8::Isolate*>(isolate),
2686         TrigonometricLookupTable::cos_x_interval_table(), table_num_bytes);
2687     v8::Local<v8::Float64Array> sin_table = v8::Float64Array::New(
2688         sin_buffer, 0, TrigonometricLookupTable::table_size());
2689     v8::Local<v8::Float64Array> cos_table = v8::Float64Array::New(
2690         cos_buffer, 0, TrigonometricLookupTable::table_size());
2691
2692     Runtime::ForceSetObjectProperty(builtins,
2693                                     factory()->InternalizeOneByteString(
2694                                         STATIC_ASCII_VECTOR("kSinTable")),
2695                                     Utils::OpenHandle(*sin_table),
2696                                     NONE).Assert();
2697     Runtime::ForceSetObjectProperty(
2698         builtins,
2699         factory()->InternalizeOneByteString(
2700             STATIC_ASCII_VECTOR("kCosXIntervalTable")),
2701         Utils::OpenHandle(*cos_table),
2702         NONE).Assert();
2703     Runtime::ForceSetObjectProperty(
2704         builtins,
2705         factory()->InternalizeOneByteString(
2706             STATIC_ASCII_VECTOR("kSamples")),
2707         factory()->NewHeapNumber(
2708             TrigonometricLookupTable::samples()),
2709         NONE).Assert();
2710     Runtime::ForceSetObjectProperty(
2711         builtins,
2712         factory()->InternalizeOneByteString(
2713             STATIC_ASCII_VECTOR("kIndexConvert")),
2714         factory()->NewHeapNumber(
2715             TrigonometricLookupTable::samples_over_pi_half()),
2716         NONE).Assert();
2717   }
2718
2719   result_ = native_context();
2720 }
2721
2722
2723 // Support for thread preemption.
2724
2725 // Reserve space for statics needing saving and restoring.
2726 int Bootstrapper::ArchiveSpacePerThread() {
2727   return sizeof(NestingCounterType);
2728 }
2729
2730
2731 // Archive statics that are thread-local.
2732 char* Bootstrapper::ArchiveState(char* to) {
2733   *reinterpret_cast<NestingCounterType*>(to) = nesting_;
2734   nesting_ = 0;
2735   return to + sizeof(NestingCounterType);
2736 }
2737
2738
2739 // Restore statics that are thread-local.
2740 char* Bootstrapper::RestoreState(char* from) {
2741   nesting_ = *reinterpret_cast<NestingCounterType*>(from);
2742   return from + sizeof(NestingCounterType);
2743 }
2744
2745
2746 // Called when the top-level V8 mutex is destroyed.
2747 void Bootstrapper::FreeThreadResources() {
2748   ASSERT(!IsActive());
2749 }
2750
2751 } }  // namespace v8::internal