OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 if (bootstrapper->delete_these_non_arrays_on_tear_down_ == NULL) { | 56 if (bootstrapper->delete_these_non_arrays_on_tear_down_ == NULL) { |
57 bootstrapper->delete_these_non_arrays_on_tear_down_ = new List<char*>(2); | 57 bootstrapper->delete_these_non_arrays_on_tear_down_ = new List<char*>(2); |
58 } | 58 } |
59 // The resources are small objects and we only make a fixed number of | 59 // The resources are small objects and we only make a fixed number of |
60 // them, but let's clean them up on exit for neatness. | 60 // them, but let's clean them up on exit for neatness. |
61 bootstrapper->delete_these_non_arrays_on_tear_down_-> | 61 bootstrapper->delete_these_non_arrays_on_tear_down_-> |
62 Add(reinterpret_cast<char*>(this)); | 62 Add(reinterpret_cast<char*>(this)); |
63 } | 63 } |
64 | 64 |
65 | 65 |
66 Bootstrapper::Bootstrapper() | 66 Bootstrapper::Bootstrapper(Isolate* isolate) |
67 : nesting_(0), | 67 : isolate_(isolate), |
| 68 nesting_(0), |
68 extensions_cache_(Script::TYPE_EXTENSION), | 69 extensions_cache_(Script::TYPE_EXTENSION), |
69 delete_these_non_arrays_on_tear_down_(NULL), | 70 delete_these_non_arrays_on_tear_down_(NULL), |
70 delete_these_arrays_on_tear_down_(NULL) { | 71 delete_these_arrays_on_tear_down_(NULL) { |
71 } | 72 } |
72 | 73 |
73 | 74 |
74 Handle<String> Bootstrapper::NativesSourceLookup(int index) { | 75 Handle<String> Bootstrapper::NativesSourceLookup(int index) { |
75 ASSERT(0 <= index && index < Natives::GetBuiltinsCount()); | 76 ASSERT(0 <= index && index < Natives::GetBuiltinsCount()); |
76 Isolate* isolate = Isolate::Current(); | 77 Heap* heap = isolate_->heap(); |
77 Factory* factory = isolate->factory(); | |
78 Heap* heap = isolate->heap(); | |
79 if (heap->natives_source_cache()->get(index)->IsUndefined()) { | 78 if (heap->natives_source_cache()->get(index)->IsUndefined()) { |
80 // We can use external strings for the natives. | 79 // We can use external strings for the natives. |
81 Vector<const char> source = Natives::GetRawScriptSource(index); | 80 Vector<const char> source = Natives::GetRawScriptSource(index); |
82 NativesExternalStringResource* resource = | 81 NativesExternalStringResource* resource = |
83 new NativesExternalStringResource(this, | 82 new NativesExternalStringResource(this, |
84 source.start(), | 83 source.start(), |
85 source.length()); | 84 source.length()); |
86 Handle<String> source_code = | 85 Handle<String> source_code = |
87 factory->NewExternalStringFromAscii(resource); | 86 isolate_->factory()->NewExternalStringFromAscii(resource); |
88 heap->natives_source_cache()->set(index, *source_code); | 87 heap->natives_source_cache()->set(index, *source_code); |
89 } | 88 } |
90 Handle<Object> cached_source(heap->natives_source_cache()->get(index)); | 89 Handle<Object> cached_source(heap->natives_source_cache()->get(index)); |
91 return Handle<String>::cast(cached_source); | 90 return Handle<String>::cast(cached_source); |
92 } | 91 } |
93 | 92 |
94 | 93 |
95 void Bootstrapper::Initialize(bool create_heap_objects) { | 94 void Bootstrapper::Initialize(bool create_heap_objects) { |
96 extensions_cache_.Initialize(create_heap_objects); | 95 extensions_cache_.Initialize(create_heap_objects); |
97 GCExtension::Register(); | 96 GCExtension::Register(); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 ExtensionTraversalState state); | 222 ExtensionTraversalState state); |
224 private: | 223 private: |
225 HashMap map_; | 224 HashMap map_; |
226 DISALLOW_COPY_AND_ASSIGN(ExtensionStates); | 225 DISALLOW_COPY_AND_ASSIGN(ExtensionStates); |
227 }; | 226 }; |
228 | 227 |
229 // Used both for deserialized and from-scratch contexts to add the extensions | 228 // Used both for deserialized and from-scratch contexts to add the extensions |
230 // provided. | 229 // provided. |
231 static bool InstallExtensions(Handle<Context> native_context, | 230 static bool InstallExtensions(Handle<Context> native_context, |
232 v8::ExtensionConfiguration* extensions); | 231 v8::ExtensionConfiguration* extensions); |
233 static bool InstallExtension(const char* name, | 232 static bool InstallExtension(Isolate* isolate, |
| 233 const char* name, |
234 ExtensionStates* extension_states); | 234 ExtensionStates* extension_states); |
235 static bool InstallExtension(v8::RegisteredExtension* current, | 235 static bool InstallExtension(Isolate* isolate, |
| 236 v8::RegisteredExtension* current, |
236 ExtensionStates* extension_states); | 237 ExtensionStates* extension_states); |
237 static void InstallSpecialObjects(Handle<Context> native_context); | 238 static void InstallSpecialObjects(Handle<Context> native_context); |
238 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); | 239 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); |
239 bool ConfigureApiObject(Handle<JSObject> object, | 240 bool ConfigureApiObject(Handle<JSObject> object, |
240 Handle<ObjectTemplateInfo> object_template); | 241 Handle<ObjectTemplateInfo> object_template); |
241 bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template); | 242 bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template); |
242 | 243 |
243 // Migrates all properties from the 'from' object to the 'to' | 244 // Migrates all properties from the 'from' object to the 'to' |
244 // object and overrides the prototype in 'to' with the one from | 245 // object and overrides the prototype in 'to' with the one from |
245 // 'from'. | 246 // 'from'. |
(...skipping 15 matching lines...) Expand all Loading... |
261 | 262 |
262 Handle<Map> CreateStrictModeFunctionMap( | 263 Handle<Map> CreateStrictModeFunctionMap( |
263 PrototypePropertyMode prototype_mode, | 264 PrototypePropertyMode prototype_mode, |
264 Handle<JSFunction> empty_function); | 265 Handle<JSFunction> empty_function); |
265 | 266 |
266 void SetStrictFunctionInstanceDescriptor(Handle<Map> map, | 267 void SetStrictFunctionInstanceDescriptor(Handle<Map> map, |
267 PrototypePropertyMode propertyMode); | 268 PrototypePropertyMode propertyMode); |
268 | 269 |
269 static bool CompileBuiltin(Isolate* isolate, int index); | 270 static bool CompileBuiltin(Isolate* isolate, int index); |
270 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); | 271 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); |
271 static bool CompileNative(Vector<const char> name, Handle<String> source); | 272 static bool CompileNative(Isolate* isolate, |
272 static bool CompileScriptCached(Vector<const char> name, | 273 Vector<const char> name, |
| 274 Handle<String> source); |
| 275 static bool CompileScriptCached(Isolate* isolate, |
| 276 Vector<const char> name, |
273 Handle<String> source, | 277 Handle<String> source, |
274 SourceCodeCache* cache, | 278 SourceCodeCache* cache, |
275 v8::Extension* extension, | 279 v8::Extension* extension, |
276 Handle<Context> top_context, | 280 Handle<Context> top_context, |
277 bool use_runtime_context); | 281 bool use_runtime_context); |
278 | 282 |
279 Handle<Context> result_; | 283 Handle<Context> result_; |
280 | 284 |
281 // Function instance maps. Function literal maps are created initially with | 285 // Function instance maps. Function literal maps are created initially with |
282 // a read only prototype for the processing of JS builtins. Later the function | 286 // a read only prototype for the processing of JS builtins. Later the function |
283 // instance maps are replaced in order to make prototype writable. | 287 // instance maps are replaced in order to make prototype writable. |
284 // These are the final, writable prototype, maps. | 288 // These are the final, writable prototype, maps. |
285 Handle<Map> function_instance_map_writable_prototype_; | 289 Handle<Map> function_instance_map_writable_prototype_; |
286 Handle<Map> strict_mode_function_instance_map_writable_prototype_; | 290 Handle<Map> strict_mode_function_instance_map_writable_prototype_; |
287 Handle<JSFunction> throw_type_error_function; | 291 Handle<JSFunction> throw_type_error_function; |
288 | 292 |
289 BootstrapperActive active_; | 293 BootstrapperActive active_; |
290 friend class Bootstrapper; | 294 friend class Bootstrapper; |
291 }; | 295 }; |
292 | 296 |
293 | 297 |
294 void Bootstrapper::Iterate(ObjectVisitor* v) { | 298 void Bootstrapper::Iterate(ObjectVisitor* v) { |
295 extensions_cache_.Iterate(v); | 299 extensions_cache_.Iterate(v); |
296 v->Synchronize(VisitorSynchronization::kExtensions); | 300 v->Synchronize(VisitorSynchronization::kExtensions); |
297 } | 301 } |
298 | 302 |
299 | 303 |
300 Handle<Context> Bootstrapper::CreateEnvironment( | 304 Handle<Context> Bootstrapper::CreateEnvironment( |
301 Isolate* isolate, | |
302 Handle<Object> global_object, | 305 Handle<Object> global_object, |
303 v8::Handle<v8::ObjectTemplate> global_template, | 306 v8::Handle<v8::ObjectTemplate> global_template, |
304 v8::ExtensionConfiguration* extensions) { | 307 v8::ExtensionConfiguration* extensions) { |
305 HandleScope scope; | 308 HandleScope scope(isolate_); |
306 Handle<Context> env; | 309 Handle<Context> env; |
307 Genesis genesis(isolate, global_object, global_template, extensions); | 310 Genesis genesis(isolate_, global_object, global_template, extensions); |
308 env = genesis.result(); | 311 env = genesis.result(); |
309 if (!env.is_null()) { | 312 if (!env.is_null()) { |
310 if (InstallExtensions(env, extensions)) { | 313 if (InstallExtensions(env, extensions)) { |
311 return env; | 314 return env; |
312 } | 315 } |
313 } | 316 } |
314 return Handle<Context>(); | 317 return Handle<Context>(); |
315 } | 318 } |
316 | 319 |
317 | 320 |
(...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 prototype, Builtins::kIllegal, true); | 1290 prototype, Builtins::kIllegal, true); |
1288 } | 1291 } |
1289 } | 1292 } |
1290 } | 1293 } |
1291 | 1294 |
1292 | 1295 |
1293 bool Genesis::CompileBuiltin(Isolate* isolate, int index) { | 1296 bool Genesis::CompileBuiltin(Isolate* isolate, int index) { |
1294 Vector<const char> name = Natives::GetScriptName(index); | 1297 Vector<const char> name = Natives::GetScriptName(index); |
1295 Handle<String> source_code = | 1298 Handle<String> source_code = |
1296 isolate->bootstrapper()->NativesSourceLookup(index); | 1299 isolate->bootstrapper()->NativesSourceLookup(index); |
1297 return CompileNative(name, source_code); | 1300 return CompileNative(isolate, name, source_code); |
1298 } | 1301 } |
1299 | 1302 |
1300 | 1303 |
1301 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { | 1304 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { |
1302 Vector<const char> name = ExperimentalNatives::GetScriptName(index); | 1305 Vector<const char> name = ExperimentalNatives::GetScriptName(index); |
1303 Factory* factory = isolate->factory(); | 1306 Factory* factory = isolate->factory(); |
1304 Handle<String> source_code = | 1307 Handle<String> source_code = |
1305 factory->NewStringFromAscii( | 1308 factory->NewStringFromAscii( |
1306 ExperimentalNatives::GetRawScriptSource(index)); | 1309 ExperimentalNatives::GetRawScriptSource(index)); |
1307 return CompileNative(name, source_code); | 1310 return CompileNative(isolate, name, source_code); |
1308 } | 1311 } |
1309 | 1312 |
1310 | 1313 |
1311 bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) { | 1314 bool Genesis::CompileNative(Isolate* isolate, |
1312 HandleScope scope; | 1315 Vector<const char> name, |
1313 Isolate* isolate = source->GetIsolate(); | 1316 Handle<String> source) { |
| 1317 HandleScope scope(isolate); |
1314 #ifdef ENABLE_DEBUGGER_SUPPORT | 1318 #ifdef ENABLE_DEBUGGER_SUPPORT |
1315 isolate->debugger()->set_compiling_natives(true); | 1319 isolate->debugger()->set_compiling_natives(true); |
1316 #endif | 1320 #endif |
1317 // During genesis, the boilerplate for stack overflow won't work until the | 1321 // During genesis, the boilerplate for stack overflow won't work until the |
1318 // environment has been at least partially initialized. Add a stack check | 1322 // environment has been at least partially initialized. Add a stack check |
1319 // before entering JS code to catch overflow early. | 1323 // before entering JS code to catch overflow early. |
1320 StackLimitCheck check(Isolate::Current()); | 1324 StackLimitCheck check(isolate); |
1321 if (check.HasOverflowed()) return false; | 1325 if (check.HasOverflowed()) return false; |
1322 | 1326 |
1323 bool result = CompileScriptCached(name, | 1327 bool result = CompileScriptCached(isolate, |
| 1328 name, |
1324 source, | 1329 source, |
1325 NULL, | 1330 NULL, |
1326 NULL, | 1331 NULL, |
1327 Handle<Context>(isolate->context()), | 1332 Handle<Context>(isolate->context()), |
1328 true); | 1333 true); |
1329 ASSERT(isolate->has_pending_exception() != result); | 1334 ASSERT(isolate->has_pending_exception() != result); |
1330 if (!result) isolate->clear_pending_exception(); | 1335 if (!result) isolate->clear_pending_exception(); |
1331 #ifdef ENABLE_DEBUGGER_SUPPORT | 1336 #ifdef ENABLE_DEBUGGER_SUPPORT |
1332 isolate->debugger()->set_compiling_natives(false); | 1337 isolate->debugger()->set_compiling_natives(false); |
1333 #endif | 1338 #endif |
1334 return result; | 1339 return result; |
1335 } | 1340 } |
1336 | 1341 |
1337 | 1342 |
1338 bool Genesis::CompileScriptCached(Vector<const char> name, | 1343 bool Genesis::CompileScriptCached(Isolate* isolate, |
| 1344 Vector<const char> name, |
1339 Handle<String> source, | 1345 Handle<String> source, |
1340 SourceCodeCache* cache, | 1346 SourceCodeCache* cache, |
1341 v8::Extension* extension, | 1347 v8::Extension* extension, |
1342 Handle<Context> top_context, | 1348 Handle<Context> top_context, |
1343 bool use_runtime_context) { | 1349 bool use_runtime_context) { |
1344 Factory* factory = source->GetIsolate()->factory(); | 1350 Factory* factory = isolate->factory(); |
1345 HandleScope scope; | 1351 HandleScope scope(isolate); |
1346 Handle<SharedFunctionInfo> function_info; | 1352 Handle<SharedFunctionInfo> function_info; |
1347 | 1353 |
1348 // If we can't find the function in the cache, we compile a new | 1354 // If we can't find the function in the cache, we compile a new |
1349 // function and insert it into the cache. | 1355 // function and insert it into the cache. |
1350 if (cache == NULL || !cache->Lookup(name, &function_info)) { | 1356 if (cache == NULL || !cache->Lookup(name, &function_info)) { |
1351 ASSERT(source->IsOneByteRepresentation()); | 1357 ASSERT(source->IsOneByteRepresentation()); |
1352 Handle<String> script_name = factory->NewStringFromUtf8(name); | 1358 Handle<String> script_name = factory->NewStringFromUtf8(name); |
1353 function_info = Compiler::Compile( | 1359 function_info = Compiler::Compile( |
1354 source, | 1360 source, |
1355 script_name, | 1361 script_name, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1391 #define INSTALL_NATIVE(Type, name, var) \ | 1397 #define INSTALL_NATIVE(Type, name, var) \ |
1392 Handle<String> var##_name = \ | 1398 Handle<String> var##_name = \ |
1393 factory()->LookupOneByteSymbol(STATIC_ASCII_VECTOR(name)); \ | 1399 factory()->LookupOneByteSymbol(STATIC_ASCII_VECTOR(name)); \ |
1394 Object* var##_native = \ | 1400 Object* var##_native = \ |
1395 native_context()->builtins()->GetPropertyNoExceptionThrown( \ | 1401 native_context()->builtins()->GetPropertyNoExceptionThrown( \ |
1396 *var##_name); \ | 1402 *var##_name); \ |
1397 native_context()->set_##var(Type::cast(var##_native)); | 1403 native_context()->set_##var(Type::cast(var##_native)); |
1398 | 1404 |
1399 | 1405 |
1400 void Genesis::InstallNativeFunctions() { | 1406 void Genesis::InstallNativeFunctions() { |
1401 HandleScope scope; | 1407 HandleScope scope(isolate()); |
1402 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); | 1408 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); |
1403 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); | 1409 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); |
1404 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); | 1410 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); |
1405 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); | 1411 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); |
1406 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); | 1412 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); |
1407 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); | 1413 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); |
1408 INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun); | 1414 INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun); |
1409 INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); | 1415 INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); |
1410 INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); | 1416 INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); |
1411 INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun); | 1417 INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun); |
(...skipping 16 matching lines...) Expand all Loading... |
1428 INSTALL_NATIVE(JSFunction, "NotifyChange", observers_notify_change); | 1434 INSTALL_NATIVE(JSFunction, "NotifyChange", observers_notify_change); |
1429 INSTALL_NATIVE(JSFunction, "DeliverChangeRecords", | 1435 INSTALL_NATIVE(JSFunction, "DeliverChangeRecords", |
1430 observers_deliver_changes); | 1436 observers_deliver_changes); |
1431 } | 1437 } |
1432 } | 1438 } |
1433 | 1439 |
1434 #undef INSTALL_NATIVE | 1440 #undef INSTALL_NATIVE |
1435 | 1441 |
1436 | 1442 |
1437 bool Genesis::InstallNatives() { | 1443 bool Genesis::InstallNatives() { |
1438 HandleScope scope; | 1444 HandleScope scope(isolate()); |
1439 | 1445 |
1440 // Create a function for the builtins object. Allocate space for the | 1446 // Create a function for the builtins object. Allocate space for the |
1441 // JavaScript builtins, a reference to the builtins object | 1447 // JavaScript builtins, a reference to the builtins object |
1442 // (itself) and a reference to the native_context directly in the object. | 1448 // (itself) and a reference to the native_context directly in the object. |
1443 Handle<Code> code = Handle<Code>( | 1449 Handle<Code> code = Handle<Code>( |
1444 isolate()->builtins()->builtin(Builtins::kIllegal)); | 1450 isolate()->builtins()->builtin(Builtins::kIllegal)); |
1445 Handle<JSFunction> builtins_fun = | 1451 Handle<JSFunction> builtins_fun = |
1446 factory()->NewFunction(factory()->empty_symbol(), | 1452 factory()->NewFunction(factory()->empty_symbol(), |
1447 JS_BUILTINS_OBJECT_TYPE, | 1453 JS_BUILTINS_OBJECT_TYPE, |
1448 JSBuiltinsObject::kSize, code, true); | 1454 JSBuiltinsObject::kSize, code, true); |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1889 BuiltinFunctionId id) { | 1895 BuiltinFunctionId id) { |
1890 Factory* factory = holder->GetIsolate()->factory(); | 1896 Factory* factory = holder->GetIsolate()->factory(); |
1891 Handle<String> name = factory->LookupUtf8Symbol(function_name); | 1897 Handle<String> name = factory->LookupUtf8Symbol(function_name); |
1892 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); | 1898 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); |
1893 Handle<JSFunction> function(JSFunction::cast(function_object)); | 1899 Handle<JSFunction> function(JSFunction::cast(function_object)); |
1894 function->shared()->set_function_data(Smi::FromInt(id)); | 1900 function->shared()->set_function_data(Smi::FromInt(id)); |
1895 } | 1901 } |
1896 | 1902 |
1897 | 1903 |
1898 void Genesis::InstallBuiltinFunctionIds() { | 1904 void Genesis::InstallBuiltinFunctionIds() { |
1899 HandleScope scope; | 1905 HandleScope scope(isolate()); |
1900 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ | 1906 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ |
1901 { \ | 1907 { \ |
1902 Handle<JSObject> holder = ResolveBuiltinIdHolder( \ | 1908 Handle<JSObject> holder = ResolveBuiltinIdHolder( \ |
1903 native_context(), #holder_expr); \ | 1909 native_context(), #holder_expr); \ |
1904 BuiltinFunctionId id = k##name; \ | 1910 BuiltinFunctionId id = k##name; \ |
1905 InstallBuiltinFunctionId(holder, #fun_name, id); \ | 1911 InstallBuiltinFunctionId(holder, #fun_name, id); \ |
1906 } | 1912 } |
1907 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) | 1913 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) |
1908 #undef INSTALL_BUILTIN_ID | 1914 #undef INSTALL_BUILTIN_ID |
1909 } | 1915 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 | 1960 |
1955 void Genesis::InitializeNormalizedMapCaches() { | 1961 void Genesis::InitializeNormalizedMapCaches() { |
1956 Handle<FixedArray> array( | 1962 Handle<FixedArray> array( |
1957 FACTORY->NewFixedArray(NormalizedMapCache::kEntries, TENURED)); | 1963 FACTORY->NewFixedArray(NormalizedMapCache::kEntries, TENURED)); |
1958 native_context()->set_normalized_map_cache(NormalizedMapCache::cast(*array)); | 1964 native_context()->set_normalized_map_cache(NormalizedMapCache::cast(*array)); |
1959 } | 1965 } |
1960 | 1966 |
1961 | 1967 |
1962 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, | 1968 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, |
1963 v8::ExtensionConfiguration* extensions) { | 1969 v8::ExtensionConfiguration* extensions) { |
1964 Isolate* isolate = native_context->GetIsolate(); | 1970 BootstrapperActive active(this); |
1965 BootstrapperActive active; | 1971 SaveContext saved_context(isolate_); |
1966 SaveContext saved_context(isolate); | 1972 isolate_->set_context(*native_context); |
1967 isolate->set_context(*native_context); | |
1968 if (!Genesis::InstallExtensions(native_context, extensions)) return false; | 1973 if (!Genesis::InstallExtensions(native_context, extensions)) return false; |
1969 Genesis::InstallSpecialObjects(native_context); | 1974 Genesis::InstallSpecialObjects(native_context); |
1970 return true; | 1975 return true; |
1971 } | 1976 } |
1972 | 1977 |
1973 | 1978 |
1974 void Genesis::InstallSpecialObjects(Handle<Context> native_context) { | 1979 void Genesis::InstallSpecialObjects(Handle<Context> native_context) { |
1975 Isolate* isolate = native_context->GetIsolate(); | 1980 Isolate* isolate = native_context->GetIsolate(); |
1976 Factory* factory = isolate->factory(); | 1981 Factory* factory = isolate->factory(); |
1977 HandleScope scope; | 1982 HandleScope scope(isolate); |
1978 Handle<JSGlobalObject> global(JSGlobalObject::cast( | 1983 Handle<JSGlobalObject> global(JSGlobalObject::cast( |
1979 native_context->global_object())); | 1984 native_context->global_object())); |
1980 // Expose the natives in global if a name for it is specified. | 1985 // Expose the natives in global if a name for it is specified. |
1981 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { | 1986 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { |
1982 Handle<String> natives = factory->LookupUtf8Symbol(FLAG_expose_natives_as); | 1987 Handle<String> natives = factory->LookupUtf8Symbol(FLAG_expose_natives_as); |
1983 CHECK_NOT_EMPTY_HANDLE(isolate, | 1988 CHECK_NOT_EMPTY_HANDLE(isolate, |
1984 JSObject::SetLocalPropertyIgnoreAttributes( | 1989 JSObject::SetLocalPropertyIgnoreAttributes( |
1985 global, natives, | 1990 global, natives, |
1986 Handle<JSObject>(global->builtins()), | 1991 Handle<JSObject>(global->builtins()), |
1987 DONT_ENUM)); | 1992 DONT_ENUM)); |
1988 } | 1993 } |
1989 | 1994 |
1990 Handle<Object> Error = GetProperty(global, "Error"); | 1995 Handle<Object> Error = GetProperty(global, "Error"); |
1991 if (Error->IsJSObject()) { | 1996 if (Error->IsJSObject()) { |
1992 Handle<String> name = | 1997 Handle<String> name = |
1993 factory->LookupOneByteSymbol(STATIC_ASCII_VECTOR("stackTraceLimit")); | 1998 factory->LookupOneByteSymbol(STATIC_ASCII_VECTOR("stackTraceLimit")); |
1994 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit)); | 1999 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit)); |
1995 CHECK_NOT_EMPTY_HANDLE(isolate, | 2000 CHECK_NOT_EMPTY_HANDLE(isolate, |
1996 JSObject::SetLocalPropertyIgnoreAttributes( | 2001 JSObject::SetLocalPropertyIgnoreAttributes( |
1997 Handle<JSObject>::cast(Error), name, | 2002 Handle<JSObject>::cast(Error), name, |
1998 stack_trace_limit, NONE)); | 2003 stack_trace_limit, NONE)); |
1999 } | 2004 } |
2000 | 2005 |
2001 #ifdef ENABLE_DEBUGGER_SUPPORT | 2006 #ifdef ENABLE_DEBUGGER_SUPPORT |
2002 // Expose the debug global object in global if a name for it is specified. | 2007 // Expose the debug global object in global if a name for it is specified. |
2003 if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) { | 2008 if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) { |
2004 Debug* debug = Isolate::Current()->debug(); | 2009 Debug* debug = isolate->debug(); |
2005 // If loading fails we just bail out without installing the | 2010 // If loading fails we just bail out without installing the |
2006 // debugger but without tanking the whole context. | 2011 // debugger but without tanking the whole context. |
2007 if (!debug->Load()) return; | 2012 if (!debug->Load()) return; |
2008 // Set the security token for the debugger context to the same as | 2013 // Set the security token for the debugger context to the same as |
2009 // the shell native context to allow calling between these (otherwise | 2014 // the shell native context to allow calling between these (otherwise |
2010 // exposing debug global object doesn't make much sense). | 2015 // exposing debug global object doesn't make much sense). |
2011 debug->debug_context()->set_security_token( | 2016 debug->debug_context()->set_security_token( |
2012 native_context->security_token()); | 2017 native_context->security_token()); |
2013 | 2018 |
2014 Handle<String> debug_string = | 2019 Handle<String> debug_string = |
(...skipping 28 matching lines...) Expand all Loading... |
2043 } | 2048 } |
2044 | 2049 |
2045 void Genesis::ExtensionStates::set_state(RegisteredExtension* extension, | 2050 void Genesis::ExtensionStates::set_state(RegisteredExtension* extension, |
2046 ExtensionTraversalState state) { | 2051 ExtensionTraversalState state) { |
2047 map_.Lookup(extension, Hash(extension), true)->value = | 2052 map_.Lookup(extension, Hash(extension), true)->value = |
2048 reinterpret_cast<void*>(static_cast<intptr_t>(state)); | 2053 reinterpret_cast<void*>(static_cast<intptr_t>(state)); |
2049 } | 2054 } |
2050 | 2055 |
2051 bool Genesis::InstallExtensions(Handle<Context> native_context, | 2056 bool Genesis::InstallExtensions(Handle<Context> native_context, |
2052 v8::ExtensionConfiguration* extensions) { | 2057 v8::ExtensionConfiguration* extensions) { |
2053 // TODO(isolates): Extensions on multiple isolates may take a little more | 2058 Isolate* isolate = native_context->GetIsolate(); |
2054 // effort. (The external API reads 'ignore'-- does that mean | |
2055 // we can break the interface?) | |
2056 | |
2057 | |
2058 ExtensionStates extension_states; // All extensions have state UNVISITED. | 2059 ExtensionStates extension_states; // All extensions have state UNVISITED. |
2059 // Install auto extensions. | 2060 // Install auto extensions. |
2060 v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension(); | 2061 v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension(); |
2061 while (current != NULL) { | 2062 while (current != NULL) { |
2062 if (current->extension()->auto_enable()) | 2063 if (current->extension()->auto_enable()) |
2063 InstallExtension(current, &extension_states); | 2064 InstallExtension(isolate, current, &extension_states); |
2064 current = current->next(); | 2065 current = current->next(); |
2065 } | 2066 } |
2066 | 2067 |
2067 if (FLAG_expose_gc) InstallExtension("v8/gc", &extension_states); | 2068 if (FLAG_expose_gc) InstallExtension(isolate, "v8/gc", &extension_states); |
2068 if (FLAG_expose_externalize_string) { | 2069 if (FLAG_expose_externalize_string) { |
2069 InstallExtension("v8/externalize", &extension_states); | 2070 InstallExtension(isolate, "v8/externalize", &extension_states); |
2070 } | 2071 } |
2071 if (FLAG_track_gc_object_stats) { | 2072 if (FLAG_track_gc_object_stats) { |
2072 InstallExtension("v8/statistics", &extension_states); | 2073 InstallExtension(isolate, "v8/statistics", &extension_states); |
2073 } | 2074 } |
2074 | 2075 |
2075 if (extensions == NULL) return true; | 2076 if (extensions == NULL) return true; |
2076 // Install required extensions | 2077 // Install required extensions |
2077 int count = v8::ImplementationUtilities::GetNameCount(extensions); | 2078 int count = v8::ImplementationUtilities::GetNameCount(extensions); |
2078 const char** names = v8::ImplementationUtilities::GetNames(extensions); | 2079 const char** names = v8::ImplementationUtilities::GetNames(extensions); |
2079 for (int i = 0; i < count; i++) { | 2080 for (int i = 0; i < count; i++) { |
2080 if (!InstallExtension(names[i], &extension_states)) | 2081 if (!InstallExtension(isolate, names[i], &extension_states)) |
2081 return false; | 2082 return false; |
2082 } | 2083 } |
2083 | 2084 |
2084 return true; | 2085 return true; |
2085 } | 2086 } |
2086 | 2087 |
2087 | 2088 |
2088 // Installs a named extension. This methods is unoptimized and does | 2089 // Installs a named extension. This methods is unoptimized and does |
2089 // not scale well if we want to support a large number of extensions. | 2090 // not scale well if we want to support a large number of extensions. |
2090 bool Genesis::InstallExtension(const char* name, | 2091 bool Genesis::InstallExtension(Isolate* isolate, |
| 2092 const char* name, |
2091 ExtensionStates* extension_states) { | 2093 ExtensionStates* extension_states) { |
2092 v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension(); | 2094 v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension(); |
2093 // Loop until we find the relevant extension | 2095 // Loop until we find the relevant extension |
2094 while (current != NULL) { | 2096 while (current != NULL) { |
2095 if (strcmp(name, current->extension()->name()) == 0) break; | 2097 if (strcmp(name, current->extension()->name()) == 0) break; |
2096 current = current->next(); | 2098 current = current->next(); |
2097 } | 2099 } |
2098 // Didn't find the extension; fail. | 2100 // Didn't find the extension; fail. |
2099 if (current == NULL) { | 2101 if (current == NULL) { |
2100 v8::Utils::ReportApiFailure( | 2102 v8::Utils::ReportApiFailure( |
2101 "v8::Context::New()", "Cannot find required extension"); | 2103 "v8::Context::New()", "Cannot find required extension"); |
2102 return false; | 2104 return false; |
2103 } | 2105 } |
2104 return InstallExtension(current, extension_states); | 2106 return InstallExtension(isolate, current, extension_states); |
2105 } | 2107 } |
2106 | 2108 |
2107 | 2109 |
2108 bool Genesis::InstallExtension(v8::RegisteredExtension* current, | 2110 bool Genesis::InstallExtension(Isolate* isolate, |
| 2111 v8::RegisteredExtension* current, |
2109 ExtensionStates* extension_states) { | 2112 ExtensionStates* extension_states) { |
2110 HandleScope scope; | 2113 HandleScope scope(isolate); |
2111 | 2114 |
2112 if (extension_states->get_state(current) == INSTALLED) return true; | 2115 if (extension_states->get_state(current) == INSTALLED) return true; |
2113 // The current node has already been visited so there must be a | 2116 // The current node has already been visited so there must be a |
2114 // cycle in the dependency graph; fail. | 2117 // cycle in the dependency graph; fail. |
2115 if (extension_states->get_state(current) == VISITED) { | 2118 if (extension_states->get_state(current) == VISITED) { |
2116 v8::Utils::ReportApiFailure( | 2119 v8::Utils::ReportApiFailure( |
2117 "v8::Context::New()", "Circular extension dependency"); | 2120 "v8::Context::New()", "Circular extension dependency"); |
2118 return false; | 2121 return false; |
2119 } | 2122 } |
2120 ASSERT(extension_states->get_state(current) == UNVISITED); | 2123 ASSERT(extension_states->get_state(current) == UNVISITED); |
2121 extension_states->set_state(current, VISITED); | 2124 extension_states->set_state(current, VISITED); |
2122 v8::Extension* extension = current->extension(); | 2125 v8::Extension* extension = current->extension(); |
2123 // Install the extension's dependencies | 2126 // Install the extension's dependencies |
2124 for (int i = 0; i < extension->dependency_count(); i++) { | 2127 for (int i = 0; i < extension->dependency_count(); i++) { |
2125 if (!InstallExtension(extension->dependencies()[i], extension_states)) | 2128 if (!InstallExtension(isolate, |
| 2129 extension->dependencies()[i], |
| 2130 extension_states)) { |
2126 return false; | 2131 return false; |
| 2132 } |
2127 } | 2133 } |
2128 Isolate* isolate = Isolate::Current(); | |
2129 Handle<String> source_code = | 2134 Handle<String> source_code = |
2130 isolate->factory()->NewExternalStringFromAscii(extension->source()); | 2135 isolate->factory()->NewExternalStringFromAscii(extension->source()); |
2131 bool result = CompileScriptCached( | 2136 bool result = CompileScriptCached(isolate, |
2132 CStrVector(extension->name()), | 2137 CStrVector(extension->name()), |
2133 source_code, | 2138 source_code, |
2134 isolate->bootstrapper()->extensions_cache(), | 2139 isolate->bootstrapper()->extensions_cache(), |
2135 extension, | 2140 extension, |
2136 Handle<Context>(isolate->context()), | 2141 Handle<Context>(isolate->context()), |
2137 false); | 2142 false); |
2138 ASSERT(isolate->has_pending_exception() != result); | 2143 ASSERT(isolate->has_pending_exception() != result); |
2139 if (!result) { | 2144 if (!result) { |
2140 // We print out the name of the extension that fail to install. | 2145 // We print out the name of the extension that fail to install. |
2141 // When an error is thrown during bootstrapping we automatically print | 2146 // When an error is thrown during bootstrapping we automatically print |
2142 // the line number at which this happened to the console in the isolate | 2147 // the line number at which this happened to the console in the isolate |
2143 // error throwing functionality. | 2148 // error throwing functionality. |
2144 OS::PrintError("Error installing extension '%s'.\n", | 2149 OS::PrintError("Error installing extension '%s'.\n", |
2145 current->extension()->name()); | 2150 current->extension()->name()); |
2146 isolate->clear_pending_exception(); | 2151 isolate->clear_pending_exception(); |
2147 } | 2152 } |
2148 extension_states->set_state(current, INSTALLED); | 2153 extension_states->set_state(current, INSTALLED); |
2149 isolate->NotifyExtensionInstalled(); | 2154 isolate->NotifyExtensionInstalled(); |
2150 return result; | 2155 return result; |
2151 } | 2156 } |
2152 | 2157 |
2153 | 2158 |
2154 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { | 2159 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { |
2155 HandleScope scope; | 2160 HandleScope scope(isolate()); |
2156 Factory* factory = builtins->GetIsolate()->factory(); | |
2157 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { | 2161 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { |
2158 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); | 2162 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); |
2159 Handle<String> name = factory->LookupUtf8Symbol(Builtins::GetName(id)); | 2163 Handle<String> name = factory()->LookupUtf8Symbol(Builtins::GetName(id)); |
2160 Object* function_object = builtins->GetPropertyNoExceptionThrown(*name); | 2164 Object* function_object = builtins->GetPropertyNoExceptionThrown(*name); |
2161 Handle<JSFunction> function | 2165 Handle<JSFunction> function |
2162 = Handle<JSFunction>(JSFunction::cast(function_object)); | 2166 = Handle<JSFunction>(JSFunction::cast(function_object)); |
2163 builtins->set_javascript_builtin(id, *function); | 2167 builtins->set_javascript_builtin(id, *function); |
2164 if (!JSFunction::CompileLazy(function, CLEAR_EXCEPTION)) { | 2168 if (!JSFunction::CompileLazy(function, CLEAR_EXCEPTION)) { |
2165 return false; | 2169 return false; |
2166 } | 2170 } |
2167 builtins->set_javascript_builtin_code(id, function->shared()->code()); | 2171 builtins->set_javascript_builtin_code(id, function->shared()->code()); |
2168 } | 2172 } |
2169 return true; | 2173 return true; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2219 | 2223 |
2220 void Genesis::TransferNamedProperties(Handle<JSObject> from, | 2224 void Genesis::TransferNamedProperties(Handle<JSObject> from, |
2221 Handle<JSObject> to) { | 2225 Handle<JSObject> to) { |
2222 if (from->HasFastProperties()) { | 2226 if (from->HasFastProperties()) { |
2223 Handle<DescriptorArray> descs = | 2227 Handle<DescriptorArray> descs = |
2224 Handle<DescriptorArray>(from->map()->instance_descriptors()); | 2228 Handle<DescriptorArray>(from->map()->instance_descriptors()); |
2225 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 2229 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
2226 PropertyDetails details = descs->GetDetails(i); | 2230 PropertyDetails details = descs->GetDetails(i); |
2227 switch (details.type()) { | 2231 switch (details.type()) { |
2228 case FIELD: { | 2232 case FIELD: { |
2229 HandleScope inner; | 2233 HandleScope inner(isolate()); |
2230 Handle<String> key = Handle<String>(descs->GetKey(i)); | 2234 Handle<String> key = Handle<String>(descs->GetKey(i)); |
2231 int index = descs->GetFieldIndex(i); | 2235 int index = descs->GetFieldIndex(i); |
2232 Handle<Object> value = Handle<Object>(from->FastPropertyAt(index)); | 2236 Handle<Object> value = Handle<Object>(from->FastPropertyAt(index)); |
2233 CHECK_NOT_EMPTY_HANDLE(to->GetIsolate(), | 2237 CHECK_NOT_EMPTY_HANDLE(to->GetIsolate(), |
2234 JSObject::SetLocalPropertyIgnoreAttributes( | 2238 JSObject::SetLocalPropertyIgnoreAttributes( |
2235 to, key, value, details.attributes())); | 2239 to, key, value, details.attributes())); |
2236 break; | 2240 break; |
2237 } | 2241 } |
2238 case CONSTANT_FUNCTION: { | 2242 case CONSTANT_FUNCTION: { |
2239 HandleScope inner; | 2243 HandleScope inner(isolate()); |
2240 Handle<String> key = Handle<String>(descs->GetKey(i)); | 2244 Handle<String> key = Handle<String>(descs->GetKey(i)); |
2241 Handle<JSFunction> fun = | 2245 Handle<JSFunction> fun = |
2242 Handle<JSFunction>(descs->GetConstantFunction(i)); | 2246 Handle<JSFunction>(descs->GetConstantFunction(i)); |
2243 CHECK_NOT_EMPTY_HANDLE(to->GetIsolate(), | 2247 CHECK_NOT_EMPTY_HANDLE(to->GetIsolate(), |
2244 JSObject::SetLocalPropertyIgnoreAttributes( | 2248 JSObject::SetLocalPropertyIgnoreAttributes( |
2245 to, key, fun, details.attributes())); | 2249 to, key, fun, details.attributes())); |
2246 break; | 2250 break; |
2247 } | 2251 } |
2248 case CALLBACKS: { | 2252 case CALLBACKS: { |
2249 LookupResult result(isolate()); | 2253 LookupResult result(isolate()); |
2250 to->LocalLookup(descs->GetKey(i), &result); | 2254 to->LocalLookup(descs->GetKey(i), &result); |
2251 // If the property is already there we skip it | 2255 // If the property is already there we skip it |
2252 if (result.IsFound()) continue; | 2256 if (result.IsFound()) continue; |
2253 HandleScope inner; | 2257 HandleScope inner(isolate()); |
2254 ASSERT(!to->HasFastProperties()); | 2258 ASSERT(!to->HasFastProperties()); |
2255 // Add to dictionary. | 2259 // Add to dictionary. |
2256 Handle<String> key = Handle<String>(descs->GetKey(i)); | 2260 Handle<String> key = Handle<String>(descs->GetKey(i)); |
2257 Handle<Object> callbacks(descs->GetCallbacksObject(i)); | 2261 Handle<Object> callbacks(descs->GetCallbacksObject(i)); |
2258 PropertyDetails d = PropertyDetails(details.attributes(), | 2262 PropertyDetails d = PropertyDetails(details.attributes(), |
2259 CALLBACKS, | 2263 CALLBACKS, |
2260 details.descriptor_index()); | 2264 details.descriptor_index()); |
2261 JSObject::SetNormalizedProperty(to, key, callbacks, d); | 2265 JSObject::SetNormalizedProperty(to, key, callbacks, d); |
2262 break; | 2266 break; |
2263 } | 2267 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2304 Handle<JSObject> to) { | 2308 Handle<JSObject> to) { |
2305 // Cloning the elements array is sufficient. | 2309 // Cloning the elements array is sufficient. |
2306 Handle<FixedArray> from_elements = | 2310 Handle<FixedArray> from_elements = |
2307 Handle<FixedArray>(FixedArray::cast(from->elements())); | 2311 Handle<FixedArray>(FixedArray::cast(from->elements())); |
2308 Handle<FixedArray> to_elements = FACTORY->CopyFixedArray(from_elements); | 2312 Handle<FixedArray> to_elements = FACTORY->CopyFixedArray(from_elements); |
2309 to->set_elements(*to_elements); | 2313 to->set_elements(*to_elements); |
2310 } | 2314 } |
2311 | 2315 |
2312 | 2316 |
2313 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { | 2317 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { |
2314 HandleScope outer; | 2318 HandleScope outer(isolate()); |
2315 Factory* factory = from->GetIsolate()->factory(); | 2319 Factory* factory = isolate()->factory(); |
2316 | 2320 |
2317 ASSERT(!from->IsJSArray()); | 2321 ASSERT(!from->IsJSArray()); |
2318 ASSERT(!to->IsJSArray()); | 2322 ASSERT(!to->IsJSArray()); |
2319 | 2323 |
2320 TransferNamedProperties(from, to); | 2324 TransferNamedProperties(from, to); |
2321 TransferIndexedProperties(from, to); | 2325 TransferIndexedProperties(from, to); |
2322 | 2326 |
2323 // Transfer the prototype (new map is needed). | 2327 // Transfer the prototype (new map is needed). |
2324 Handle<Map> old_to_map = Handle<Map>(to->map()); | 2328 Handle<Map> old_to_map = Handle<Map>(to->map()); |
2325 Handle<Map> new_to_map = factory->CopyMap(old_to_map); | 2329 Handle<Map> new_to_map = factory->CopyMap(old_to_map); |
(...skipping 13 matching lines...) Expand all Loading... |
2339 native_context()->set_function_map( | 2343 native_context()->set_function_map( |
2340 *function_instance_map_writable_prototype_); | 2344 *function_instance_map_writable_prototype_); |
2341 native_context()->set_strict_mode_function_map( | 2345 native_context()->set_strict_mode_function_map( |
2342 *strict_mode_function_instance_map_writable_prototype_); | 2346 *strict_mode_function_instance_map_writable_prototype_); |
2343 } | 2347 } |
2344 | 2348 |
2345 | 2349 |
2346 Genesis::Genesis(Isolate* isolate, | 2350 Genesis::Genesis(Isolate* isolate, |
2347 Handle<Object> global_object, | 2351 Handle<Object> global_object, |
2348 v8::Handle<v8::ObjectTemplate> global_template, | 2352 v8::Handle<v8::ObjectTemplate> global_template, |
2349 v8::ExtensionConfiguration* extensions) : isolate_(isolate) { | 2353 v8::ExtensionConfiguration* extensions) |
| 2354 : isolate_(isolate), |
| 2355 active_(isolate->bootstrapper()) { |
2350 result_ = Handle<Context>::null(); | 2356 result_ = Handle<Context>::null(); |
2351 // If V8 isn't running and cannot be initialized, just return. | 2357 // If V8 isn't running and cannot be initialized, just return. |
2352 if (!V8::IsRunning() && !V8::Initialize(NULL)) return; | 2358 if (!V8::IsRunning() && !V8::Initialize(NULL)) return; |
2353 | 2359 |
2354 // Before creating the roots we must save the context and restore it | 2360 // Before creating the roots we must save the context and restore it |
2355 // on all function exits. | 2361 // on all function exits. |
2356 HandleScope scope; | 2362 HandleScope scope(isolate); |
2357 SaveContext saved_context(isolate); | 2363 SaveContext saved_context(isolate); |
2358 | 2364 |
2359 // During genesis, the boilerplate for stack overflow won't work until the | 2365 // During genesis, the boilerplate for stack overflow won't work until the |
2360 // environment has been at least partially initialized. Add a stack check | 2366 // environment has been at least partially initialized. Add a stack check |
2361 // before entering JS code to catch overflow early. | 2367 // before entering JS code to catch overflow early. |
2362 StackLimitCheck check(Isolate::Current()); | 2368 StackLimitCheck check(isolate); |
2363 if (check.HasOverflowed()) return; | 2369 if (check.HasOverflowed()) return; |
2364 | 2370 |
2365 Handle<Context> new_context = Snapshot::NewContextFromSnapshot(); | 2371 Handle<Context> new_context = Snapshot::NewContextFromSnapshot(); |
2366 if (!new_context.is_null()) { | 2372 if (!new_context.is_null()) { |
2367 native_context_ = | 2373 native_context_ = |
2368 Handle<Context>::cast(isolate->global_handles()->Create(*new_context)); | 2374 Handle<Context>::cast(isolate->global_handles()->Create(*new_context)); |
2369 AddToWeakNativeContextList(*native_context_); | 2375 AddToWeakNativeContextList(*native_context_); |
2370 isolate->set_context(*native_context_); | 2376 isolate->set_context(*native_context_); |
2371 isolate->counters()->contexts_created_by_snapshot()->Increment(); | 2377 isolate->counters()->contexts_created_by_snapshot()->Increment(); |
2372 Handle<GlobalObject> inner_global; | 2378 Handle<GlobalObject> inner_global; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2429 return from + sizeof(NestingCounterType); | 2435 return from + sizeof(NestingCounterType); |
2430 } | 2436 } |
2431 | 2437 |
2432 | 2438 |
2433 // Called when the top-level V8 mutex is destroyed. | 2439 // Called when the top-level V8 mutex is destroyed. |
2434 void Bootstrapper::FreeThreadResources() { | 2440 void Bootstrapper::FreeThreadResources() { |
2435 ASSERT(!IsActive()); | 2441 ASSERT(!IsActive()); |
2436 } | 2442 } |
2437 | 2443 |
2438 } } // namespace v8::internal | 2444 } } // namespace v8::internal |
OLD | NEW |