| OLD | NEW |
| 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 | 232 |
| 233 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, | 233 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, |
| 234 const char* name, | 234 const char* name, |
| 235 ElementsKind elements_kind); | 235 ElementsKind elements_kind); |
| 236 bool InstallNatives(ContextType context_type); | 236 bool InstallNatives(ContextType context_type); |
| 237 | 237 |
| 238 void InstallTypedArray(const char* name, ElementsKind elements_kind, | 238 void InstallTypedArray(const char* name, ElementsKind elements_kind, |
| 239 Handle<JSFunction>* fun); | 239 Handle<JSFunction>* fun); |
| 240 bool InstallExperimentalNatives(); | 240 bool InstallExperimentalNatives(); |
| 241 bool InstallExtraNatives(); | 241 bool InstallExtraNatives(); |
| 242 bool InstallDebuggerNatives(); |
| 242 void InstallBuiltinFunctionIds(); | 243 void InstallBuiltinFunctionIds(); |
| 243 void InstallExperimentalBuiltinFunctionIds(); | 244 void InstallExperimentalBuiltinFunctionIds(); |
| 244 void InitializeNormalizedMapCaches(); | 245 void InitializeNormalizedMapCaches(); |
| 245 | 246 |
| 246 enum ExtensionTraversalState { | 247 enum ExtensionTraversalState { |
| 247 UNVISITED, VISITED, INSTALLED | 248 UNVISITED, VISITED, INSTALLED |
| 248 }; | 249 }; |
| 249 | 250 |
| 250 class ExtensionStates { | 251 class ExtensionStates { |
| 251 public: | 252 public: |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 | 348 |
| 348 Handle<Context> Bootstrapper::CreateEnvironment( | 349 Handle<Context> Bootstrapper::CreateEnvironment( |
| 349 MaybeHandle<JSGlobalProxy> maybe_global_proxy, | 350 MaybeHandle<JSGlobalProxy> maybe_global_proxy, |
| 350 v8::Local<v8::ObjectTemplate> global_proxy_template, | 351 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 351 v8::ExtensionConfiguration* extensions, ContextType context_type) { | 352 v8::ExtensionConfiguration* extensions, ContextType context_type) { |
| 352 HandleScope scope(isolate_); | 353 HandleScope scope(isolate_); |
| 353 Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template, | 354 Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template, |
| 354 extensions, context_type); | 355 extensions, context_type); |
| 355 Handle<Context> env = genesis.result(); | 356 Handle<Context> env = genesis.result(); |
| 356 if (env.is_null() || | 357 if (env.is_null() || |
| 357 (context_type == FULL_CONTEXT && !InstallExtensions(env, extensions))) { | 358 (context_type != THIN_CONTEXT && !InstallExtensions(env, extensions))) { |
| 358 return Handle<Context>(); | 359 return Handle<Context>(); |
| 359 } | 360 } |
| 360 return scope.CloseAndEscape(env); | 361 return scope.CloseAndEscape(env); |
| 361 } | 362 } |
| 362 | 363 |
| 363 | 364 |
| 364 bool Bootstrapper::CreateCodeStubContext(Isolate* isolate) { | 365 bool Bootstrapper::CreateCodeStubContext(Isolate* isolate) { |
| 365 HandleScope scope(isolate); | 366 HandleScope scope(isolate); |
| 366 SaveContext save_context(isolate); | 367 SaveContext save_context(isolate); |
| 367 BootstrapperActive active(this); | 368 BootstrapperActive active(this); |
| (...skipping 2244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2612 bool Genesis::InstallExtraNatives() { | 2613 bool Genesis::InstallExtraNatives() { |
| 2613 for (int i = ExtraNatives::GetDebuggerCount(); | 2614 for (int i = ExtraNatives::GetDebuggerCount(); |
| 2614 i < ExtraNatives::GetBuiltinsCount(); i++) { | 2615 i < ExtraNatives::GetBuiltinsCount(); i++) { |
| 2615 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; | 2616 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; |
| 2616 } | 2617 } |
| 2617 | 2618 |
| 2618 return true; | 2619 return true; |
| 2619 } | 2620 } |
| 2620 | 2621 |
| 2621 | 2622 |
| 2623 bool Genesis::InstallDebuggerNatives() { |
| 2624 for (int i = 0; i < Natives::GetDebuggerCount(); ++i) { |
| 2625 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false; |
| 2626 } |
| 2627 return CallUtilsFunction(isolate(), "PostDebug"); |
| 2628 } |
| 2629 |
| 2630 |
| 2622 bool Bootstrapper::InstallCodeStubNatives(Isolate* isolate) { | 2631 bool Bootstrapper::InstallCodeStubNatives(Isolate* isolate) { |
| 2623 for (int i = CodeStubNatives::GetDebuggerCount(); | 2632 for (int i = CodeStubNatives::GetDebuggerCount(); |
| 2624 i < CodeStubNatives::GetBuiltinsCount(); i++) { | 2633 i < CodeStubNatives::GetBuiltinsCount(); i++) { |
| 2625 if (!CompileCodeStubBuiltin(isolate, i)) return false; | 2634 if (!CompileCodeStubBuiltin(isolate, i)) return false; |
| 2626 } | 2635 } |
| 2627 | 2636 |
| 2628 return true; | 2637 return true; |
| 2629 } | 2638 } |
| 2630 | 2639 |
| 2631 | 2640 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2713 Handle<JSGlobalObject> global(JSGlobalObject::cast( | 2722 Handle<JSGlobalObject> global(JSGlobalObject::cast( |
| 2714 native_context->global_object())); | 2723 native_context->global_object())); |
| 2715 | 2724 |
| 2716 Handle<JSObject> Error = Handle<JSObject>::cast( | 2725 Handle<JSObject> Error = Handle<JSObject>::cast( |
| 2717 Object::GetProperty(isolate, global, "Error").ToHandleChecked()); | 2726 Object::GetProperty(isolate, global, "Error").ToHandleChecked()); |
| 2718 Handle<String> name = | 2727 Handle<String> name = |
| 2719 factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit")); | 2728 factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit")); |
| 2720 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); | 2729 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); |
| 2721 JSObject::AddProperty(Error, name, stack_trace_limit, NONE); | 2730 JSObject::AddProperty(Error, name, stack_trace_limit, NONE); |
| 2722 | 2731 |
| 2723 // By now the utils object is useless and can be removed. | |
| 2724 native_context->set_natives_utils_object(*factory->undefined_value()); | |
| 2725 | |
| 2726 // Expose the natives in global if a name for it is specified. | 2732 // Expose the natives in global if a name for it is specified. |
| 2727 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { | 2733 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { |
| 2728 Handle<String> natives_key = | 2734 Handle<String> natives_key = |
| 2729 factory->InternalizeUtf8String(FLAG_expose_natives_as); | 2735 factory->InternalizeUtf8String(FLAG_expose_natives_as); |
| 2730 uint32_t dummy_index; | 2736 uint32_t dummy_index; |
| 2731 if (natives_key->AsArrayIndex(&dummy_index)) return true; | 2737 if (natives_key->AsArrayIndex(&dummy_index)) return true; |
| 2732 Handle<JSBuiltinsObject> natives(global->builtins()); | 2738 Handle<JSBuiltinsObject> natives(global->builtins()); |
| 2733 JSObject::AddProperty(global, natives_key, natives, DONT_ENUM); | 2739 JSObject::AddProperty(global, natives_key, natives, DONT_ENUM); |
| 2734 } | 2740 } |
| 2735 | 2741 |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3196 Handle<GlobalObject> global_object = | 3202 Handle<GlobalObject> global_object = |
| 3197 CreateNewGlobals(global_proxy_template, global_proxy); | 3203 CreateNewGlobals(global_proxy_template, global_proxy); |
| 3198 HookUpGlobalProxy(global_object, global_proxy); | 3204 HookUpGlobalProxy(global_object, global_proxy); |
| 3199 InitializeGlobal(global_object, empty_function, context_type); | 3205 InitializeGlobal(global_object, empty_function, context_type); |
| 3200 InitializeNormalizedMapCaches(); | 3206 InitializeNormalizedMapCaches(); |
| 3201 | 3207 |
| 3202 if (!InstallNatives(context_type)) return; | 3208 if (!InstallNatives(context_type)) return; |
| 3203 | 3209 |
| 3204 MakeFunctionInstancePrototypeWritable(); | 3210 MakeFunctionInstancePrototypeWritable(); |
| 3205 | 3211 |
| 3206 if (context_type == FULL_CONTEXT) { | 3212 if (context_type != THIN_CONTEXT) { |
| 3207 if (!ConfigureGlobalObjects(global_proxy_template)) return; | 3213 if (!ConfigureGlobalObjects(global_proxy_template)) return; |
| 3208 } | 3214 } |
| 3209 isolate->counters()->contexts_created_from_scratch()->Increment(); | 3215 isolate->counters()->contexts_created_from_scratch()->Increment(); |
| 3210 } | 3216 } |
| 3211 | 3217 |
| 3212 // Install experimental and extra natives. Do not include them into the | 3218 // Install experimental and extra natives. Do not include them into the |
| 3213 // snapshot as we should be able to turn them off at runtime. Re-installing | 3219 // snapshot as we should be able to turn them off at runtime. Re-installing |
| 3214 // them after they have already been deserialized would also fail. | 3220 // them after they have already been deserialized would also fail. |
| 3215 if (context_type == FULL_CONTEXT) { | 3221 if (context_type == FULL_CONTEXT) { |
| 3216 if (!isolate->serializer_enabled()) { | 3222 if (!isolate->serializer_enabled()) { |
| 3217 InitializeExperimentalGlobal(); | 3223 InitializeExperimentalGlobal(); |
| 3218 if (!InstallExperimentalNatives()) return; | 3224 if (!InstallExperimentalNatives()) return; |
| 3219 if (!InstallExtraNatives()) return; | 3225 if (!InstallExtraNatives()) return; |
| 3226 // By now the utils object is useless and can be removed. |
| 3227 native_context()->set_natives_utils_object( |
| 3228 isolate->heap()->undefined_value()); |
| 3220 } | 3229 } |
| 3221 | 3230 |
| 3222 // The serializer cannot serialize typed arrays. Reset those typed arrays | 3231 // The serializer cannot serialize typed arrays. Reset those typed arrays |
| 3223 // for each new context. | 3232 // for each new context. |
| 3224 InitializeBuiltinTypedArrays(); | 3233 InitializeBuiltinTypedArrays(); |
| 3234 } else if (context_type == DEBUG_CONTEXT) { |
| 3235 DCHECK(!isolate->serializer_enabled()); |
| 3236 InitializeExperimentalGlobal(); |
| 3237 if (!InstallDebuggerNatives()) return; |
| 3225 } | 3238 } |
| 3226 | 3239 |
| 3227 result_ = native_context(); | 3240 result_ = native_context(); |
| 3228 } | 3241 } |
| 3229 | 3242 |
| 3230 | 3243 |
| 3231 // Support for thread preemption. | 3244 // Support for thread preemption. |
| 3232 | 3245 |
| 3233 // Reserve space for statics needing saving and restoring. | 3246 // Reserve space for statics needing saving and restoring. |
| 3234 int Bootstrapper::ArchiveSpacePerThread() { | 3247 int Bootstrapper::ArchiveSpacePerThread() { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3251 } | 3264 } |
| 3252 | 3265 |
| 3253 | 3266 |
| 3254 // Called when the top-level V8 mutex is destroyed. | 3267 // Called when the top-level V8 mutex is destroyed. |
| 3255 void Bootstrapper::FreeThreadResources() { | 3268 void Bootstrapper::FreeThreadResources() { |
| 3256 DCHECK(!IsActive()); | 3269 DCHECK(!IsActive()); |
| 3257 } | 3270 } |
| 3258 | 3271 |
| 3259 } // namespace internal | 3272 } // namespace internal |
| 3260 } // namespace v8 | 3273 } // namespace v8 |
| OLD | NEW |