Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: src/bootstrapper.cc

Issue 1213203007: Create a internal, global native context used only for generated code stubs (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Merge with latest Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/base/utils/random-number-generator.h" 9 #include "src/base/utils/random-number-generator.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 30 matching lines...) Expand all
41 return heap->experimental_natives_source_cache(); 41 return heap->experimental_natives_source_cache();
42 } 42 }
43 43
44 44
45 template <> 45 template <>
46 FixedArray* GetCache<ExtraNatives>(Heap* heap) { 46 FixedArray* GetCache<ExtraNatives>(Heap* heap) {
47 return heap->extra_natives_source_cache(); 47 return heap->extra_natives_source_cache();
48 } 48 }
49 49
50 50
51 template <>
52 FixedArray* GetCache<CodeStubNatives>(Heap* heap) {
53 return heap->code_stub_natives_source_cache();
54 }
55
56
51 template <class Source> 57 template <class Source>
52 Handle<String> Bootstrapper::SourceLookup(int index) { 58 Handle<String> Bootstrapper::SourceLookup(int index) {
53 DCHECK(0 <= index && index < Source::GetBuiltinsCount()); 59 DCHECK(0 <= index && index < Source::GetBuiltinsCount());
54 Heap* heap = isolate_->heap(); 60 Heap* heap = isolate_->heap();
55 if (GetCache<Source>(heap)->get(index)->IsUndefined()) { 61 if (GetCache<Source>(heap)->get(index)->IsUndefined()) {
56 // We can use external strings for the natives. 62 // We can use external strings for the natives.
57 Vector<const char> source = Source::GetScriptSource(index); 63 Vector<const char> source = Source::GetScriptSource(index);
58 NativesExternalStringResource* resource = 64 NativesExternalStringResource* resource =
59 new NativesExternalStringResource(source.start(), source.length()); 65 new NativesExternalStringResource(source.start(), source.length());
60 // We do not expect this to throw an exception. Change this if it does. 66 // We do not expect this to throw an exception. Change this if it does.
61 Handle<String> source_code = isolate_->factory() 67 Handle<String> source_code = isolate_->factory()
62 ->NewExternalStringFromOneByte(resource) 68 ->NewExternalStringFromOneByte(resource)
63 .ToHandleChecked(); 69 .ToHandleChecked();
64 // Mark this external string with a special map. 70 // Mark this external string with a special map.
65 source_code->set_map(isolate_->heap()->native_source_string_map()); 71 source_code->set_map(isolate_->heap()->native_source_string_map());
66 GetCache<Source>(heap)->set(index, *source_code); 72 GetCache<Source>(heap)->set(index, *source_code);
67 } 73 }
68 Handle<Object> cached_source(GetCache<Source>(heap)->get(index), isolate_); 74 Handle<Object> cached_source(GetCache<Source>(heap)->get(index), isolate_);
69 return Handle<String>::cast(cached_source); 75 return Handle<String>::cast(cached_source);
70 } 76 }
71 77
72 78
73 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); 79 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index);
74 template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>( 80 template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>(
75 int index); 81 int index);
76 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); 82 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index);
83 template Handle<String> Bootstrapper::SourceLookup<CodeStubNatives>(int index);
77 84
78 85
79 void Bootstrapper::Initialize(bool create_heap_objects) { 86 void Bootstrapper::Initialize(bool create_heap_objects) {
80 extensions_cache_.Initialize(isolate_, create_heap_objects); 87 extensions_cache_.Initialize(isolate_, create_heap_objects);
81 } 88 }
82 89
83 90
84 static const char* GCFunctionName() { 91 static const char* GCFunctionName() {
85 bool flag_given = FLAG_expose_gc_as != NULL && strlen(FLAG_expose_gc_as) != 0; 92 bool flag_given = FLAG_expose_gc_as != NULL && strlen(FLAG_expose_gc_as) != 0;
86 return flag_given ? FLAG_expose_gc_as : "gc"; 93 return flag_given ? FLAG_expose_gc_as : "gc";
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 142 }
136 } 143 }
137 } 144 }
138 } 145 }
139 146
140 147
141 void Bootstrapper::TearDown() { 148 void Bootstrapper::TearDown() {
142 DeleteNativeSources(isolate_->heap()->natives_source_cache()); 149 DeleteNativeSources(isolate_->heap()->natives_source_cache());
143 DeleteNativeSources(isolate_->heap()->experimental_natives_source_cache()); 150 DeleteNativeSources(isolate_->heap()->experimental_natives_source_cache());
144 DeleteNativeSources(isolate_->heap()->extra_natives_source_cache()); 151 DeleteNativeSources(isolate_->heap()->extra_natives_source_cache());
152 DeleteNativeSources(isolate_->heap()->code_stub_natives_source_cache());
145 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical 153 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical
146 } 154 }
147 155
148 156
149 class Genesis BASE_EMBEDDED { 157 class Genesis BASE_EMBEDDED {
150 public: 158 public:
151 Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy, 159 Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
152 v8::Local<v8::ObjectTemplate> global_proxy_template, 160 v8::Local<v8::ObjectTemplate> global_proxy_template,
153 v8::ExtensionConfiguration* extensions); 161 v8::ExtensionConfiguration* extensions, ContextType context_type);
154 ~Genesis() { } 162 ~Genesis() { }
155 163
156 Isolate* isolate() const { return isolate_; } 164 Isolate* isolate() const { return isolate_; }
157 Factory* factory() const { return isolate_->factory(); } 165 Factory* factory() const { return isolate_->factory(); }
158 Heap* heap() const { return isolate_->heap(); } 166 Heap* heap() const { return isolate_->heap(); }
159 167
160 Handle<Context> result() { return result_; } 168 Handle<Context> result() { return result_; }
161 169
162 private: 170 private:
163 Handle<Context> native_context() { return native_context_; } 171 Handle<Context> native_context() { return native_context_; }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 // other objects in the snapshot. 204 // other objects in the snapshot.
197 void HookUpGlobalObject(Handle<GlobalObject> global_object, 205 void HookUpGlobalObject(Handle<GlobalObject> global_object,
198 Handle<FixedArray> outdated_contexts); 206 Handle<FixedArray> outdated_contexts);
199 // The native context has a ScriptContextTable that store declarative bindings 207 // The native context has a ScriptContextTable that store declarative bindings
200 // made in script scopes. Add a "this" binding to that table pointing to the 208 // made in script scopes. Add a "this" binding to that table pointing to the
201 // global proxy. 209 // global proxy.
202 void InstallGlobalThisBinding(); 210 void InstallGlobalThisBinding();
203 void HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts); 211 void HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts);
204 // New context initialization. Used for creating a context from scratch. 212 // New context initialization. Used for creating a context from scratch.
205 void InitializeGlobal(Handle<GlobalObject> global_object, 213 void InitializeGlobal(Handle<GlobalObject> global_object,
206 Handle<JSFunction> empty_function); 214 Handle<JSFunction> empty_function,
215 ContextType context_type);
207 void InitializeExperimentalGlobal(); 216 void InitializeExperimentalGlobal();
208 // Installs the contents of the native .js files on the global objects. 217 // Installs the contents of the native .js files on the global objects.
209 // Used for creating a context from scratch. 218 // Used for creating a context from scratch.
210 void InstallNativeFunctions(); 219 void InstallNativeFunctions();
211 void InstallExperimentalNativeFunctions(); 220 void InstallExperimentalNativeFunctions();
212 // Typed arrays are not serializable and have to initialized afterwards. 221 // Typed arrays are not serializable and have to initialized afterwards.
213 void InitializeBuiltinTypedArrays(); 222 void InitializeBuiltinTypedArrays();
214 223
215 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ 224 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \
216 void InstallNativeFunctions_##id(); \ 225 void InstallNativeFunctions_##id(); \
217 void InitializeGlobal_##id(); 226 void InitializeGlobal_##id();
218 227
219 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION) 228 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION)
220 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION) 229 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION)
221 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) 230 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION)
222 #undef DECLARE_FEATURE_INITIALIZATION 231 #undef DECLARE_FEATURE_INITIALIZATION
223 232
224 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, 233 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target,
225 const char* name, 234 const char* name,
226 ElementsKind elements_kind); 235 ElementsKind elements_kind);
227 bool InstallNatives(); 236 bool InstallNatives(ContextType context_type);
228 237
229 void InstallTypedArray( 238 void InstallTypedArray(
230 const char* name, 239 const char* name,
231 ElementsKind elements_kind, 240 ElementsKind elements_kind,
232 Handle<JSFunction>* fun, 241 Handle<JSFunction>* fun,
233 Handle<Map>* external_map); 242 Handle<Map>* external_map);
234 bool InstallExperimentalNatives(); 243 bool InstallExperimentalNatives();
235 bool InstallExtraNatives(); 244 bool InstallExtraNatives();
236 void InstallBuiltinFunctionIds(); 245 void InstallBuiltinFunctionIds();
237 void InstallExperimentalBuiltinFunctionIds(); 246 void InstallExperimentalBuiltinFunctionIds();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 352
344 void Bootstrapper::Iterate(ObjectVisitor* v) { 353 void Bootstrapper::Iterate(ObjectVisitor* v) {
345 extensions_cache_.Iterate(v); 354 extensions_cache_.Iterate(v);
346 v->Synchronize(VisitorSynchronization::kExtensions); 355 v->Synchronize(VisitorSynchronization::kExtensions);
347 } 356 }
348 357
349 358
350 Handle<Context> Bootstrapper::CreateEnvironment( 359 Handle<Context> Bootstrapper::CreateEnvironment(
351 MaybeHandle<JSGlobalProxy> maybe_global_proxy, 360 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
352 v8::Local<v8::ObjectTemplate> global_proxy_template, 361 v8::Local<v8::ObjectTemplate> global_proxy_template,
353 v8::ExtensionConfiguration* extensions) { 362 v8::ExtensionConfiguration* extensions, ContextType context_type) {
354 HandleScope scope(isolate_); 363 HandleScope scope(isolate_);
355 Genesis genesis( 364 Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template,
356 isolate_, maybe_global_proxy, global_proxy_template, extensions); 365 extensions, context_type);
357 Handle<Context> env = genesis.result(); 366 Handle<Context> env = genesis.result();
358 if (env.is_null() || !InstallExtensions(env, extensions)) { 367 if (env.is_null() ||
368 (context_type == FULL_CONTEXT && !InstallExtensions(env, extensions))) {
359 return Handle<Context>(); 369 return Handle<Context>();
360 } 370 }
361 return scope.CloseAndEscape(env); 371 return scope.CloseAndEscape(env);
362 } 372 }
363 373
364 374
375 bool Bootstrapper::CreateCodeStubContext(Isolate* isolate) {
376 HandleScope scope(isolate);
377 SaveContext save_context(isolate);
378 BootstrapperActive active(this);
379
380 v8::ExtensionConfiguration no_extensions;
381 Handle<Context> native_context = CreateEnvironment(
382 MaybeHandle<JSGlobalProxy>(), v8::Local<v8::ObjectTemplate>(),
383 &no_extensions, THIN_CONTEXT);
384 isolate->heap()->set_code_stub_context(*native_context);
385 isolate->set_context(*native_context);
386 Handle<JSObject> code_stub_exports =
387 isolate->factory()->NewJSObject(isolate->object_function());
388 JSObject::NormalizeProperties(code_stub_exports, CLEAR_INOBJECT_PROPERTIES, 2,
389 "container to export to extra natives");
390 isolate->heap()->set_code_stub_exports_object(*code_stub_exports);
391 return InstallCodeStubNatives(isolate);
392 }
393
394
365 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { 395 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
366 // object.__proto__ = proto; 396 // object.__proto__ = proto;
367 Handle<Map> old_map = Handle<Map>(object->map()); 397 Handle<Map> old_map = Handle<Map>(object->map());
368 Handle<Map> new_map = Map::Copy(old_map, "SetObjectPrototype"); 398 Handle<Map> new_map = Map::Copy(old_map, "SetObjectPrototype");
369 Map::SetPrototype(new_map, proto, FAST_PROTOTYPE); 399 Map::SetPrototype(new_map, proto, FAST_PROTOTYPE);
370 JSObject::MigrateToMap(object, new_map); 400 JSObject::MigrateToMap(object, new_map);
371 } 401 }
372 402
373 403
374 void Bootstrapper::DetachGlobal(Handle<Context> env) { 404 void Bootstrapper::DetachGlobal(Handle<Context> env) {
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 // Set up the reference from the global object to the builtins object. 1015 // Set up the reference from the global object to the builtins object.
986 JSGlobalObject::cast(*global_object)->set_builtins(*builtins_global); 1016 JSGlobalObject::cast(*global_object)->set_builtins(*builtins_global);
987 TransferNamedProperties(global_object_from_snapshot, global_object); 1017 TransferNamedProperties(global_object_from_snapshot, global_object);
988 TransferIndexedProperties(global_object_from_snapshot, global_object); 1018 TransferIndexedProperties(global_object_from_snapshot, global_object);
989 } 1019 }
990 1020
991 1021
992 // This is only called if we are not using snapshots. The equivalent 1022 // This is only called if we are not using snapshots. The equivalent
993 // work in the snapshot case is done in HookUpGlobalObject. 1023 // work in the snapshot case is done in HookUpGlobalObject.
994 void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, 1024 void Genesis::InitializeGlobal(Handle<GlobalObject> global_object,
995 Handle<JSFunction> empty_function) { 1025 Handle<JSFunction> empty_function,
1026 ContextType context_type) {
996 // --- N a t i v e C o n t e x t --- 1027 // --- N a t i v e C o n t e x t ---
997 // Use the empty function as closure (no scope info). 1028 // Use the empty function as closure (no scope info).
998 native_context()->set_closure(*empty_function); 1029 native_context()->set_closure(*empty_function);
999 native_context()->set_previous(NULL); 1030 native_context()->set_previous(NULL);
1000 // Set extension and global object. 1031 // Set extension and global object.
1001 native_context()->set_extension(*global_object); 1032 native_context()->set_extension(*global_object);
1002 native_context()->set_global_object(*global_object); 1033 native_context()->set_global_object(*global_object);
1003 // Security setup: Set the security token of the native context to the global 1034 // Security setup: Set the security token of the native context to the global
1004 // object. This makes the security check between two different contexts fail 1035 // object. This makes the security check between two different contexts fail
1005 // by default even in case of global object reinitialization. 1036 // by default even in case of global object reinitialization.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 CacheInitialJSArrayMaps(native_context(), initial_map); 1096 CacheInitialJSArrayMaps(native_context(), initial_map);
1066 ArrayConstructorStub array_constructor_stub(isolate); 1097 ArrayConstructorStub array_constructor_stub(isolate);
1067 Handle<Code> code = array_constructor_stub.GetCode(); 1098 Handle<Code> code = array_constructor_stub.GetCode();
1068 array_function->shared()->set_construct_stub(*code); 1099 array_function->shared()->set_construct_stub(*code);
1069 1100
1070 Handle<Map> initial_strong_map = 1101 Handle<Map> initial_strong_map =
1071 Map::Copy(initial_map, "SetInstancePrototype"); 1102 Map::Copy(initial_map, "SetInstancePrototype");
1072 initial_strong_map->set_is_strong(); 1103 initial_strong_map->set_is_strong();
1073 CacheInitialJSArrayMaps(native_context(), initial_strong_map); 1104 CacheInitialJSArrayMaps(native_context(), initial_strong_map);
1074 } 1105 }
1075 1106
Yang 2015/07/08 08:32:53 Do you really need Number, Boolean, String, Symbol
danno 2015/07/08 20:25:59 Yes. Unfortunately the rest of the initialization
1076 { // --- N u m b e r --- 1107 { // --- N u m b e r ---
1077 Handle<JSFunction> number_fun = 1108 Handle<JSFunction> number_fun =
1078 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, 1109 InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
1079 isolate->initial_object_prototype(), 1110 isolate->initial_object_prototype(),
1080 Builtins::kIllegal); 1111 Builtins::kIllegal);
1081 native_context()->set_number_function(*number_fun); 1112 native_context()->set_number_function(*number_fun);
1082 } 1113 }
1083 1114
1084 { // --- B o o l e a n --- 1115 { // --- B o o l e a n ---
1085 Handle<JSFunction> boolean_fun = 1116 Handle<JSFunction> boolean_fun =
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, 1241 proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
1211 Smi::FromInt(0), 1242 Smi::FromInt(0),
1212 SKIP_WRITE_BARRIER); // It's a Smi. 1243 SKIP_WRITE_BARRIER); // It's a Smi.
1213 proto_map->set_is_prototype_map(true); 1244 proto_map->set_is_prototype_map(true);
1214 Map::SetPrototype(initial_map, proto); 1245 Map::SetPrototype(initial_map, proto);
1215 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), 1246 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto),
1216 JSRegExp::IRREGEXP, factory->empty_string(), 1247 JSRegExp::IRREGEXP, factory->empty_string(),
1217 JSRegExp::Flags(0), 0); 1248 JSRegExp::Flags(0), 0);
1218 } 1249 }
1219 1250
1251 // Initialize the embedder data slot.
1252 Handle<FixedArray> embedder_data = factory->NewFixedArray(3);
1253 native_context()->set_embedder_data(*embedder_data);
1254
1255 if (context_type == THIN_CONTEXT) return;
1256
1220 { // -- J S O N 1257 { // -- J S O N
1221 Handle<String> name = factory->InternalizeUtf8String("JSON"); 1258 Handle<String> name = factory->InternalizeUtf8String("JSON");
1222 Handle<JSFunction> cons = factory->NewFunction(name); 1259 Handle<JSFunction> cons = factory->NewFunction(name);
1223 JSFunction::SetInstancePrototype(cons, 1260 JSFunction::SetInstancePrototype(cons,
1224 Handle<Object>(native_context()->initial_object_prototype(), isolate)); 1261 Handle<Object>(native_context()->initial_object_prototype(), isolate));
1225 cons->SetInstanceClassName(*name); 1262 cons->SetInstanceClassName(*name);
1226 Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED); 1263 Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED);
1227 DCHECK(json_object->IsJSObject()); 1264 DCHECK(json_object->IsJSObject());
1228 JSObject::AddProperty(global, name, json_object, DONT_ENUM); 1265 JSObject::AddProperty(global, name, json_object, DONT_ENUM);
1229 native_context()->set_json_object(*json_object); 1266 native_context()->set_json_object(*json_object);
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1455 { 1492 {
1456 // Set up the call-as-constructor delegate. 1493 // Set up the call-as-constructor delegate.
1457 Handle<Code> code = 1494 Handle<Code> code =
1458 Handle<Code>(isolate->builtins()->builtin( 1495 Handle<Code>(isolate->builtins()->builtin(
1459 Builtins::kHandleApiCallAsConstructor)); 1496 Builtins::kHandleApiCallAsConstructor));
1460 Handle<JSFunction> delegate = factory->NewFunction( 1497 Handle<JSFunction> delegate = factory->NewFunction(
1461 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); 1498 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1462 native_context()->set_call_as_constructor_delegate(*delegate); 1499 native_context()->set_call_as_constructor_delegate(*delegate);
1463 delegate->shared()->DontAdaptArguments(); 1500 delegate->shared()->DontAdaptArguments();
1464 } 1501 }
1465
1466 // Initialize the embedder data slot.
1467 Handle<FixedArray> embedder_data = factory->NewFixedArray(3);
1468 native_context()->set_embedder_data(*embedder_data);
1469 } 1502 }
1470 1503
1471 1504
1472 void Genesis::InstallTypedArray( 1505 void Genesis::InstallTypedArray(
1473 const char* name, 1506 const char* name,
1474 ElementsKind elements_kind, 1507 ElementsKind elements_kind,
1475 Handle<JSFunction>* fun, 1508 Handle<JSFunction>* fun,
1476 Handle<Map>* external_map) { 1509 Handle<Map>* external_map) {
1477 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 1510 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1478 Handle<JSFunction> result = InstallFunction( 1511 Handle<JSFunction> result = InstallFunction(
(...skipping 16 matching lines...) Expand all
1495 void Genesis::InitializeExperimentalGlobal() { 1528 void Genesis::InitializeExperimentalGlobal() {
1496 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id(); 1529 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
1497 1530
1498 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL) 1531 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
1499 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL) 1532 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
1500 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL) 1533 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
1501 #undef FEATURE_INITIALIZE_GLOBAL 1534 #undef FEATURE_INITIALIZE_GLOBAL
1502 } 1535 }
1503 1536
1504 1537
1505 bool Genesis::CompileBuiltin(Isolate* isolate, int index) { 1538 bool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) {
1506 Vector<const char> name = Natives::GetScriptName(index); 1539 Vector<const char> name = Natives::GetScriptName(index);
1507 Handle<String> source_code = 1540 Handle<String> source_code =
1508 isolate->bootstrapper()->SourceLookup<Natives>(index); 1541 isolate->bootstrapper()->SourceLookup<Natives>(index);
1509 Handle<Object> global = isolate->global_object(); 1542 Handle<Object> global = isolate->global_object();
1510 Handle<Object> utils = isolate->natives_utils_object(); 1543 Handle<Object> utils = isolate->natives_utils_object();
1511 Handle<Object> args[] = {global, utils}; 1544 Handle<Object> args[] = {global, utils};
1512 return CompileNative(isolate, name, source_code, arraysize(args), args); 1545
1546 return Bootstrapper::CompileNative(
1547 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()),
1548 source_code, arraysize(args), args);
1513 } 1549 }
1514 1550
1515 1551
1516 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { 1552 bool Bootstrapper::CompileExperimentalBuiltin(Isolate* isolate, int index) {
1517 HandleScope scope(isolate); 1553 HandleScope scope(isolate);
1518 Vector<const char> name = ExperimentalNatives::GetScriptName(index); 1554 Vector<const char> name = ExperimentalNatives::GetScriptName(index);
1519 Handle<String> source_code = 1555 Handle<String> source_code =
1520 isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index); 1556 isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index);
1521 Handle<Object> global = isolate->global_object(); 1557 Handle<Object> global = isolate->global_object();
1522 Handle<Object> utils = isolate->natives_utils_object(); 1558 Handle<Object> utils = isolate->natives_utils_object();
1523 Handle<Object> args[] = {global, utils}; 1559 Handle<Object> args[] = {global, utils};
1524 return CompileNative(isolate, name, source_code, arraysize(args), args); 1560 return Bootstrapper::CompileNative(
1561 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()),
1562 source_code, arraysize(args), args);
1525 } 1563 }
1526 1564
1527 1565
1528 bool Genesis::CompileExtraBuiltin(Isolate* isolate, int index) { 1566 bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) {
1529 HandleScope scope(isolate); 1567 HandleScope scope(isolate);
1530 Vector<const char> name = ExtraNatives::GetScriptName(index); 1568 Vector<const char> name = ExtraNatives::GetScriptName(index);
1531 Handle<String> source_code = 1569 Handle<String> source_code =
1532 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); 1570 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index);
1533 Handle<Object> global = isolate->global_object(); 1571 Handle<Object> global = isolate->global_object();
1534 Handle<Object> exports = isolate->extras_exports_object(); 1572 Handle<Object> exports = isolate->extras_exports_object();
1535 Handle<Object> args[] = {global, exports}; 1573 Handle<Object> args[] = {global, exports};
1536 return CompileNative(isolate, name, source_code, arraysize(args), args); 1574 return Bootstrapper::CompileNative(
1575 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()),
1576 source_code, arraysize(args), args);
1537 } 1577 }
1538 1578
1539 1579
1540 bool Genesis::CompileNative(Isolate* isolate, Vector<const char> name, 1580 bool Bootstrapper::CompileCodeStubBuiltin(Isolate* isolate, int index) {
1541 Handle<String> source, int argc, 1581 HandleScope scope(isolate);
1542 Handle<Object> argv[]) { 1582 Vector<const char> name = CodeStubNatives::GetScriptName(index);
1583 Handle<String> source_code =
1584 isolate->bootstrapper()->SourceLookup<CodeStubNatives>(index);
1585 Handle<JSObject> global(isolate->global_object());
1586 Handle<JSObject> exports(isolate->heap()->code_stub_exports_object());
1587 Handle<Object> args[] = {global, exports};
1588 bool result =
1589 CompileNative(isolate, name, global, source_code, arraysize(args), args);
1590 return result;
1591 }
1592
1593
1594 bool Bootstrapper::CompileNative(Isolate* isolate, Vector<const char> name,
1595 Handle<JSObject> receiver,
1596 Handle<String> source, int argc,
1597 Handle<Object> argv[]) {
1543 SuppressDebug compiling_natives(isolate->debug()); 1598 SuppressDebug compiling_natives(isolate->debug());
1544 // During genesis, the boilerplate for stack overflow won't work until the 1599 // During genesis, the boilerplate for stack overflow won't work until the
1545 // environment has been at least partially initialized. Add a stack check 1600 // environment has been at least partially initialized. Add a stack check
1546 // before entering JS code to catch overflow early. 1601 // before entering JS code to catch overflow early.
1547 StackLimitCheck check(isolate); 1602 StackLimitCheck check(isolate);
1548 if (check.JsHasOverflowed(1 * KB)) { 1603 if (check.JsHasOverflowed(1 * KB)) {
1549 isolate->StackOverflow(); 1604 isolate->StackOverflow();
1550 return false; 1605 return false;
1551 } 1606 }
1552 1607
1553 Handle<Context> context(isolate->context()); 1608 Handle<Context> context(isolate->context());
1554 1609
1555 Handle<String> script_name = 1610 Handle<String> script_name =
1556 isolate->factory()->NewStringFromUtf8(name).ToHandleChecked(); 1611 isolate->factory()->NewStringFromUtf8(name).ToHandleChecked();
1557 Handle<SharedFunctionInfo> function_info = Compiler::CompileScript( 1612 Handle<SharedFunctionInfo> function_info = Compiler::CompileScript(
1558 source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(), 1613 source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
1559 context, NULL, NULL, ScriptCompiler::kNoCompileOptions, NATIVES_CODE, 1614 context, NULL, NULL, ScriptCompiler::kNoCompileOptions, NATIVES_CODE,
1560 false); 1615 false);
1561 if (function_info.is_null()) return false; 1616 if (function_info.is_null()) return false;
1562 1617
1563 DCHECK(context->IsNativeContext()); 1618 DCHECK(context->IsNativeContext());
1564 1619
1565 Handle<Context> runtime_context(context->runtime_context()); 1620 Handle<Context> runtime_context(context->runtime_context());
1566 Handle<JSBuiltinsObject> receiver(context->builtins());
1567 Handle<JSFunction> fun = 1621 Handle<JSFunction> fun =
1568 isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info, 1622 isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info,
1569 runtime_context); 1623 runtime_context);
1570 1624
1571 // For non-extension scripts, run script to get the function wrapper. 1625 // For non-extension scripts, run script to get the function wrapper.
1572 Handle<Object> wrapper; 1626 Handle<Object> wrapper;
1573 if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) { 1627 if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) {
1574 return false; 1628 return false;
1575 } 1629 }
1576 // Then run the function wrapper. 1630 // Then run the function wrapper.
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1962 { // Add length. 2016 { // Add length.
1963 AccessorConstantDescriptor d(Handle<Name>(Name::cast(array_length->name())), 2017 AccessorConstantDescriptor d(Handle<Name>(Name::cast(array_length->name())),
1964 array_length, attribs); 2018 array_length, attribs);
1965 initial_map->AppendDescriptor(&d); 2019 initial_map->AppendDescriptor(&d);
1966 } 2020 }
1967 2021
1968 return array_function; 2022 return array_function;
1969 } 2023 }
1970 2024
1971 2025
1972 bool Genesis::InstallNatives() { 2026 bool Genesis::InstallNatives(ContextType context_type) {
1973 HandleScope scope(isolate()); 2027 HandleScope scope(isolate());
1974 2028
1975 // Create a function for the builtins object. Allocate space for the 2029 // Create a function for the builtins object. Allocate space for the
1976 // JavaScript builtins, a reference to the builtins object 2030 // JavaScript builtins, a reference to the builtins object
1977 // (itself) and a reference to the native_context directly in the object. 2031 // (itself) and a reference to the native_context directly in the object.
1978 Handle<Code> code = Handle<Code>( 2032 Handle<Code> code = Handle<Code>(
1979 isolate()->builtins()->builtin(Builtins::kIllegal)); 2033 isolate()->builtins()->builtin(Builtins::kIllegal));
1980 Handle<JSFunction> builtins_fun = factory()->NewFunction( 2034 Handle<JSFunction> builtins_fun = factory()->NewFunction(
1981 factory()->empty_string(), code, JS_BUILTINS_OBJECT_TYPE, 2035 factory()->empty_string(), code, JS_BUILTINS_OBJECT_TYPE,
1982 JSBuiltinsObject::kSize); 2036 JSBuiltinsObject::kSize);
(...skipping 27 matching lines...) Expand all
2010 Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string()); 2064 Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string());
2011 DCHECK(bridge->context() == *isolate()->native_context()); 2065 DCHECK(bridge->context() == *isolate()->native_context());
2012 2066
2013 // Allocate the builtins context. 2067 // Allocate the builtins context.
2014 Handle<Context> context = 2068 Handle<Context> context =
2015 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); 2069 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge);
2016 context->set_global_object(*builtins); // override builtins global object 2070 context->set_global_object(*builtins); // override builtins global object
2017 2071
2018 native_context()->set_runtime_context(*context); 2072 native_context()->set_runtime_context(*context);
2019 2073
2074 if (context_type == THIN_CONTEXT) {
2075 int i = Natives::GetDebuggerCount();
Yang 2015/07/08 08:32:53 I'd rename 'i' into 'js_builtins_script_index'.
danno 2015/07/08 20:25:59 Done.
2076 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
2077 if (!InstallJSBuiltins(builtins)) return false;
2078 return true;
2079 }
2080
2020 // Set up the utils object as shared container between native scripts. 2081 // Set up the utils object as shared container between native scripts.
2021 Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function()); 2082 Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function());
2022 JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16, 2083 JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16,
2023 "utils container for native scripts"); 2084 "utils container for native scripts");
2024 native_context()->set_natives_utils_object(*utils); 2085 native_context()->set_natives_utils_object(*utils);
2025 2086
2026 Handle<JSObject> extras_exports = 2087 Handle<JSObject> extras_exports =
2027 factory()->NewJSObject(isolate()->object_function()); 2088 factory()->NewJSObject(isolate()->object_function());
2028 JSObject::NormalizeProperties(extras_exports, CLEAR_INOBJECT_PROPERTIES, 2, 2089 JSObject::NormalizeProperties(extras_exports, CLEAR_INOBJECT_PROPERTIES, 2,
2029 "container to export to extra natives"); 2090 "container to export to extra natives");
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 static const PropertyAttributes attributes = 2369 static const PropertyAttributes attributes =
2309 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); 2370 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
2310 #define INSTALL_PUBLIC_SYMBOL(name, varname, description) \ 2371 #define INSTALL_PUBLIC_SYMBOL(name, varname, description) \
2311 Handle<String> varname = factory()->NewStringFromStaticChars(#varname); \ 2372 Handle<String> varname = factory()->NewStringFromStaticChars(#varname); \
2312 JSObject::AddProperty(builtins, varname, factory()->name(), attributes); 2373 JSObject::AddProperty(builtins, varname, factory()->name(), attributes);
2313 PUBLIC_SYMBOL_LIST(INSTALL_PUBLIC_SYMBOL) 2374 PUBLIC_SYMBOL_LIST(INSTALL_PUBLIC_SYMBOL)
2314 #undef INSTALL_PUBLIC_SYMBOL 2375 #undef INSTALL_PUBLIC_SYMBOL
2315 } 2376 }
2316 2377
2317 int i = Natives::GetDebuggerCount(); 2378 int i = Natives::GetDebuggerCount();
2318 if (!CompileBuiltin(isolate(), i)) return false; 2379 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
2380
2319 if (!InstallJSBuiltins(builtins)) return false; 2381 if (!InstallJSBuiltins(builtins)) return false;
2320 2382
2321 for (++i; i < Natives::GetBuiltinsCount(); ++i) { 2383 for (++i; i < Natives::GetBuiltinsCount(); ++i) {
2322 if (!CompileBuiltin(isolate(), i)) return false; 2384 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
2323 } 2385 }
2324 2386
2325 if (!CallUtilsFunction(isolate(), "PostNatives")) return false; 2387 if (!CallUtilsFunction(isolate(), "PostNatives")) return false;
2326 2388
2327 InstallNativeFunctions(); 2389 InstallNativeFunctions();
2328 2390
2329 auto function_cache = 2391 auto function_cache =
2330 ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize); 2392 ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize);
2331 native_context()->set_function_cache(*function_cache); 2393 native_context()->set_function_cache(*function_cache);
2332 2394
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
2502 static const char* harmony_new_target_natives[] = {nullptr}; 2564 static const char* harmony_new_target_natives[] = {nullptr};
2503 2565
2504 for (int i = ExperimentalNatives::GetDebuggerCount(); 2566 for (int i = ExperimentalNatives::GetDebuggerCount();
2505 i < ExperimentalNatives::GetBuiltinsCount(); i++) { 2567 i < ExperimentalNatives::GetBuiltinsCount(); i++) {
2506 #define INSTALL_EXPERIMENTAL_NATIVES(id, desc) \ 2568 #define INSTALL_EXPERIMENTAL_NATIVES(id, desc) \
2507 if (FLAG_##id) { \ 2569 if (FLAG_##id) { \
2508 for (size_t j = 0; id##_natives[j] != NULL; j++) { \ 2570 for (size_t j = 0; id##_natives[j] != NULL; j++) { \
2509 Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \ 2571 Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \
2510 if (strncmp(script_name.start(), id##_natives[j], \ 2572 if (strncmp(script_name.start(), id##_natives[j], \
2511 script_name.length()) == 0) { \ 2573 script_name.length()) == 0) { \
2512 if (!CompileExperimentalBuiltin(isolate(), i)) return false; \ 2574 if (!Bootstrapper::CompileExperimentalBuiltin(isolate(), i)) { \
2575 return false; \
2576 } \
2513 } \ 2577 } \
2514 } \ 2578 } \
2515 } 2579 }
2516 HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES); 2580 HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES);
2517 HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES); 2581 HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES);
2518 HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES); 2582 HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES);
2519 #undef INSTALL_EXPERIMENTAL_NATIVES 2583 #undef INSTALL_EXPERIMENTAL_NATIVES
2520 } 2584 }
2521 2585
2522 if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false; 2586 if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false;
2523 2587
2524 InstallExperimentalNativeFunctions(); 2588 InstallExperimentalNativeFunctions();
2525 InstallExperimentalBuiltinFunctionIds(); 2589 InstallExperimentalBuiltinFunctionIds();
2526 return true; 2590 return true;
2527 } 2591 }
2528 2592
2529 2593
2530 bool Genesis::InstallExtraNatives() { 2594 bool Genesis::InstallExtraNatives() {
2531 for (int i = ExtraNatives::GetDebuggerCount(); 2595 for (int i = ExtraNatives::GetDebuggerCount();
2532 i < ExtraNatives::GetBuiltinsCount(); i++) { 2596 i < ExtraNatives::GetBuiltinsCount(); i++) {
2533 if (!CompileExtraBuiltin(isolate(), i)) return false; 2597 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false;
2534 } 2598 }
2535 2599
2536 return true; 2600 return true;
2601 }
2602
2603
2604 bool Bootstrapper::InstallCodeStubNatives(Isolate* isolate) {
2605 for (int i = CodeStubNatives::GetDebuggerCount();
2606 i < CodeStubNatives::GetBuiltinsCount(); i++) {
2607 if (!CompileCodeStubBuiltin(isolate, i)) return false;
2608 }
2609
2610 return true;
2537 } 2611 }
2538 2612
2539 2613
2540 static void InstallBuiltinFunctionId(Handle<JSObject> holder, 2614 static void InstallBuiltinFunctionId(Handle<JSObject> holder,
2541 const char* function_name, 2615 const char* function_name,
2542 BuiltinFunctionId id) { 2616 BuiltinFunctionId id) {
2543 Isolate* isolate = holder->GetIsolate(); 2617 Isolate* isolate = holder->GetIsolate();
2544 Handle<Object> function_object = 2618 Handle<Object> function_object =
2545 Object::GetProperty(isolate, holder, function_name).ToHandleChecked(); 2619 Object::GetProperty(isolate, holder, function_name).ToHandleChecked();
2546 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); 2620 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
3072 3146
3073 private: 3147 private:
3074 bool flag_; 3148 bool flag_;
3075 bool enabled_; 3149 bool enabled_;
3076 }; 3150 };
3077 3151
3078 3152
3079 Genesis::Genesis(Isolate* isolate, 3153 Genesis::Genesis(Isolate* isolate,
3080 MaybeHandle<JSGlobalProxy> maybe_global_proxy, 3154 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
3081 v8::Local<v8::ObjectTemplate> global_proxy_template, 3155 v8::Local<v8::ObjectTemplate> global_proxy_template,
3082 v8::ExtensionConfiguration* extensions) 3156 v8::ExtensionConfiguration* extensions,
3157 ContextType context_type)
3083 : isolate_(isolate), active_(isolate->bootstrapper()) { 3158 : isolate_(isolate), active_(isolate->bootstrapper()) {
3084 NoTrackDoubleFieldsForSerializerScope disable_scope(isolate); 3159 NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
3085 result_ = Handle<Context>::null(); 3160 result_ = Handle<Context>::null();
3086 // Before creating the roots we must save the context and restore it 3161 // Before creating the roots we must save the context and restore it
3087 // on all function exits. 3162 // on all function exits.
3088 SaveContext saved_context(isolate); 3163 SaveContext saved_context(isolate);
3089 3164
3090 // During genesis, the boilerplate for stack overflow won't work until the 3165 // During genesis, the boilerplate for stack overflow won't work until the
3091 // environment has been at least partially initialized. Add a stack check 3166 // environment has been at least partially initialized. Add a stack check
3092 // before entering JS code to catch overflow early. 3167 // before entering JS code to catch overflow early.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3140 if (!ConfigureGlobalObjects(global_proxy_template)) return; 3215 if (!ConfigureGlobalObjects(global_proxy_template)) return;
3141 } else { 3216 } else {
3142 // We get here if there was no context snapshot. 3217 // We get here if there was no context snapshot.
3143 CreateRoots(); 3218 CreateRoots();
3144 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); 3219 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
3145 CreateStrictModeFunctionMaps(empty_function); 3220 CreateStrictModeFunctionMaps(empty_function);
3146 CreateStrongModeFunctionMaps(empty_function); 3221 CreateStrongModeFunctionMaps(empty_function);
3147 Handle<GlobalObject> global_object = 3222 Handle<GlobalObject> global_object =
3148 CreateNewGlobals(global_proxy_template, global_proxy); 3223 CreateNewGlobals(global_proxy_template, global_proxy);
3149 HookUpGlobalProxy(global_object, global_proxy); 3224 HookUpGlobalProxy(global_object, global_proxy);
3150 InitializeGlobal(global_object, empty_function); 3225 InitializeGlobal(global_object, empty_function, context_type);
3151 InstallJSFunctionResultCaches(); 3226 InstallJSFunctionResultCaches();
3152 InitializeNormalizedMapCaches(); 3227 InitializeNormalizedMapCaches();
3153 if (!InstallNatives()) return; 3228
3229 if (!InstallNatives(context_type)) return;
3154 3230
3155 MakeFunctionInstancePrototypeWritable(); 3231 MakeFunctionInstancePrototypeWritable();
3156 3232
3157 if (!ConfigureGlobalObjects(global_proxy_template)) return; 3233 if (context_type == FULL_CONTEXT) {
3234 if (!ConfigureGlobalObjects(global_proxy_template)) return;
3235 }
3158 isolate->counters()->contexts_created_from_scratch()->Increment(); 3236 isolate->counters()->contexts_created_from_scratch()->Increment();
3159 } 3237 }
3160 3238
3161 // Install experimental and extra natives. Do not include them into the 3239 // Install experimental and extra natives. Do not include them into the
3162 // snapshot as we should be able to turn them off at runtime. Re-installing 3240 // snapshot as we should be able to turn them off at runtime. Re-installing
3163 // them after they have already been deserialized would also fail. 3241 // them after they have already been deserialized would also fail.
3164 if (!isolate->serializer_enabled()) { 3242 if (context_type == FULL_CONTEXT) {
3165 InitializeExperimentalGlobal(); 3243 if (!isolate->serializer_enabled()) {
3166 if (!InstallExperimentalNatives()) return; 3244 InitializeExperimentalGlobal();
3167 if (!InstallExtraNatives()) return; 3245 if (!InstallExperimentalNatives()) return;
3246 if (!InstallExtraNatives()) return;
3247 }
3248
3249 // The serializer cannot serialize typed arrays. Reset those typed arrays
3250 // for each new context.
3251 InitializeBuiltinTypedArrays();
3168 } 3252 }
3169 3253
3170 // The serializer cannot serialize typed arrays. Reset those typed arrays
3171 // for each new context.
3172 InitializeBuiltinTypedArrays();
3173
3174 result_ = native_context(); 3254 result_ = native_context();
3175 } 3255 }
3176 3256
3177 3257
3178 // Support for thread preemption. 3258 // Support for thread preemption.
3179 3259
3180 // Reserve space for statics needing saving and restoring. 3260 // Reserve space for statics needing saving and restoring.
3181 int Bootstrapper::ArchiveSpacePerThread() { 3261 int Bootstrapper::ArchiveSpacePerThread() {
3182 return sizeof(NestingCounterType); 3262 return sizeof(NestingCounterType);
3183 } 3263 }
(...skipping 14 matching lines...) Expand all
3198 } 3278 }
3199 3279
3200 3280
3201 // Called when the top-level V8 mutex is destroyed. 3281 // Called when the top-level V8 mutex is destroyed.
3202 void Bootstrapper::FreeThreadResources() { 3282 void Bootstrapper::FreeThreadResources() {
3203 DCHECK(!IsActive()); 3283 DCHECK(!IsActive());
3204 } 3284 }
3205 3285
3206 } // namespace internal 3286 } // namespace internal
3207 } // namespace v8 3287 } // namespace v8
OLDNEW
« no previous file with comments | « src/bootstrapper.h ('k') | src/code-stubs.cc » ('j') | src/snapshot/serialize.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698