| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 } | 44 } |
| 45 Handle<Object> cached_source(Source::GetSourceCache(heap)->get(index), | 45 Handle<Object> cached_source(Source::GetSourceCache(heap)->get(index), |
| 46 isolate_); | 46 isolate_); |
| 47 return Handle<String>::cast(cached_source); | 47 return Handle<String>::cast(cached_source); |
| 48 } | 48 } |
| 49 | 49 |
| 50 | 50 |
| 51 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); | 51 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); |
| 52 template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>( | 52 template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>( |
| 53 int index); | 53 int index); |
| 54 template Handle<String> Bootstrapper::SourceLookup<ExperimentalExtraNatives>( |
| 55 int index); |
| 54 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); | 56 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); |
| 55 template Handle<String> Bootstrapper::SourceLookup<CodeStubNatives>(int index); | 57 template Handle<String> Bootstrapper::SourceLookup<CodeStubNatives>(int index); |
| 56 | 58 |
| 57 | 59 |
| 58 void Bootstrapper::Initialize(bool create_heap_objects) { | 60 void Bootstrapper::Initialize(bool create_heap_objects) { |
| 59 extensions_cache_.Initialize(isolate_, create_heap_objects); | 61 extensions_cache_.Initialize(isolate_, create_heap_objects); |
| 60 } | 62 } |
| 61 | 63 |
| 62 | 64 |
| 63 static const char* GCFunctionName() { | 65 static const char* GCFunctionName() { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 } | 116 } |
| 115 } | 117 } |
| 116 } | 118 } |
| 117 } | 119 } |
| 118 | 120 |
| 119 | 121 |
| 120 void Bootstrapper::TearDown() { | 122 void Bootstrapper::TearDown() { |
| 121 DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); | 123 DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); |
| 122 DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap())); | 124 DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap())); |
| 123 DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); | 125 DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); |
| 126 DeleteNativeSources( |
| 127 ExperimentalExtraNatives::GetSourceCache(isolate_->heap())); |
| 124 DeleteNativeSources(CodeStubNatives::GetSourceCache(isolate_->heap())); | 128 DeleteNativeSources(CodeStubNatives::GetSourceCache(isolate_->heap())); |
| 129 |
| 125 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical | 130 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical |
| 126 } | 131 } |
| 127 | 132 |
| 128 | 133 |
| 129 class Genesis BASE_EMBEDDED { | 134 class Genesis BASE_EMBEDDED { |
| 130 public: | 135 public: |
| 131 Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy, | 136 Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy, |
| 132 v8::Local<v8::ObjectTemplate> global_proxy_template, | 137 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 133 v8::ExtensionConfiguration* extensions, ContextType context_type); | 138 v8::ExtensionConfiguration* extensions, ContextType context_type); |
| 134 ~Genesis() { } | 139 ~Genesis() { } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 | 204 |
| 200 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, | 205 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, |
| 201 const char* name, | 206 const char* name, |
| 202 ElementsKind elements_kind); | 207 ElementsKind elements_kind); |
| 203 bool InstallNatives(ContextType context_type); | 208 bool InstallNatives(ContextType context_type); |
| 204 | 209 |
| 205 void InstallTypedArray(const char* name, ElementsKind elements_kind, | 210 void InstallTypedArray(const char* name, ElementsKind elements_kind, |
| 206 Handle<JSFunction>* fun); | 211 Handle<JSFunction>* fun); |
| 207 bool InstallExperimentalNatives(); | 212 bool InstallExperimentalNatives(); |
| 208 bool InstallExtraNatives(); | 213 bool InstallExtraNatives(); |
| 214 bool InstallExperimentalExtraNatives(); |
| 209 bool InstallDebuggerNatives(); | 215 bool InstallDebuggerNatives(); |
| 210 void InstallBuiltinFunctionIds(); | 216 void InstallBuiltinFunctionIds(); |
| 211 void InstallExperimentalBuiltinFunctionIds(); | 217 void InstallExperimentalBuiltinFunctionIds(); |
| 212 void InitializeNormalizedMapCaches(); | 218 void InitializeNormalizedMapCaches(); |
| 213 | 219 |
| 214 enum ExtensionTraversalState { | 220 enum ExtensionTraversalState { |
| 215 UNVISITED, VISITED, INSTALLED | 221 UNVISITED, VISITED, INSTALLED |
| 216 }; | 222 }; |
| 217 | 223 |
| 218 class ExtensionStates { | 224 class ExtensionStates { |
| (...skipping 1306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); | 1531 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); |
| 1526 Handle<Object> global = isolate->global_object(); | 1532 Handle<Object> global = isolate->global_object(); |
| 1527 Handle<Object> binding = isolate->extras_binding_object(); | 1533 Handle<Object> binding = isolate->extras_binding_object(); |
| 1528 Handle<Object> args[] = {global, binding}; | 1534 Handle<Object> args[] = {global, binding}; |
| 1529 return Bootstrapper::CompileNative( | 1535 return Bootstrapper::CompileNative( |
| 1530 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()), | 1536 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()), |
| 1531 source_code, arraysize(args), args); | 1537 source_code, arraysize(args), args); |
| 1532 } | 1538 } |
| 1533 | 1539 |
| 1534 | 1540 |
| 1541 bool Bootstrapper::CompileExperimentalExtraBuiltin(Isolate* isolate, |
| 1542 int index) { |
| 1543 HandleScope scope(isolate); |
| 1544 Vector<const char> name = ExperimentalExtraNatives::GetScriptName(index); |
| 1545 Handle<String> source_code = |
| 1546 isolate->bootstrapper()->SourceLookup<ExperimentalExtraNatives>(index); |
| 1547 Handle<Object> global = isolate->global_object(); |
| 1548 Handle<Object> binding = isolate->extras_binding_object(); |
| 1549 Handle<Object> args[] = {global, binding}; |
| 1550 return Bootstrapper::CompileNative( |
| 1551 isolate, name, Handle<JSObject>(isolate->native_context()->builtins()), |
| 1552 source_code, arraysize(args), args); |
| 1553 } |
| 1554 |
| 1555 |
| 1535 bool Bootstrapper::CompileCodeStubBuiltin(Isolate* isolate, int index) { | 1556 bool Bootstrapper::CompileCodeStubBuiltin(Isolate* isolate, int index) { |
| 1536 HandleScope scope(isolate); | 1557 HandleScope scope(isolate); |
| 1537 Vector<const char> name = CodeStubNatives::GetScriptName(index); | 1558 Vector<const char> name = CodeStubNatives::GetScriptName(index); |
| 1538 Handle<String> source_code = | 1559 Handle<String> source_code = |
| 1539 isolate->bootstrapper()->SourceLookup<CodeStubNatives>(index); | 1560 isolate->bootstrapper()->SourceLookup<CodeStubNatives>(index); |
| 1540 Handle<JSObject> global(isolate->global_object()); | 1561 Handle<JSObject> global(isolate->global_object()); |
| 1541 Handle<JSObject> exports(isolate->heap()->code_stub_exports_object()); | 1562 Handle<JSObject> exports(isolate->heap()->code_stub_exports_object()); |
| 1542 Handle<Object> args[] = {global, exports}; | 1563 Handle<Object> args[] = {global, exports}; |
| 1543 bool result = | 1564 bool result = |
| 1544 CompileNative(isolate, name, global, source_code, arraysize(args), args); | 1565 CompileNative(isolate, name, global, source_code, arraysize(args), args); |
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2631 | 2652 |
| 2632 for (int i = ExtraNatives::GetDebuggerCount(); | 2653 for (int i = ExtraNatives::GetDebuggerCount(); |
| 2633 i < ExtraNatives::GetBuiltinsCount(); i++) { | 2654 i < ExtraNatives::GetBuiltinsCount(); i++) { |
| 2634 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; | 2655 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; |
| 2635 } | 2656 } |
| 2636 | 2657 |
| 2637 return true; | 2658 return true; |
| 2638 } | 2659 } |
| 2639 | 2660 |
| 2640 | 2661 |
| 2662 bool Genesis::InstallExperimentalExtraNatives() { |
| 2663 for (int i = ExperimentalExtraNatives::GetDebuggerCount(); |
| 2664 i < ExperimentalExtraNatives::GetBuiltinsCount(); i++) { |
| 2665 if (!Bootstrapper::CompileExperimentalExtraBuiltin(isolate(), i)) |
| 2666 return false; |
| 2667 } |
| 2668 |
| 2669 return true; |
| 2670 } |
| 2671 |
| 2672 |
| 2641 bool Genesis::InstallDebuggerNatives() { | 2673 bool Genesis::InstallDebuggerNatives() { |
| 2642 for (int i = 0; i < Natives::GetDebuggerCount(); ++i) { | 2674 for (int i = 0; i < Natives::GetDebuggerCount(); ++i) { |
| 2643 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false; | 2675 if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false; |
| 2644 } | 2676 } |
| 2645 return CallUtilsFunction(isolate(), "PostDebug"); | 2677 return CallUtilsFunction(isolate(), "PostDebug"); |
| 2646 } | 2678 } |
| 2647 | 2679 |
| 2648 | 2680 |
| 2649 bool Bootstrapper::InstallCodeStubNatives(Isolate* isolate) { | 2681 bool Bootstrapper::InstallCodeStubNatives(Isolate* isolate) { |
| 2650 for (int i = CodeStubNatives::GetDebuggerCount(); | 2682 for (int i = CodeStubNatives::GetDebuggerCount(); |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3230 isolate->counters()->contexts_created_from_scratch()->Increment(); | 3262 isolate->counters()->contexts_created_from_scratch()->Increment(); |
| 3231 } | 3263 } |
| 3232 | 3264 |
| 3233 // Install experimental natives. Do not include them into the | 3265 // Install experimental natives. Do not include them into the |
| 3234 // snapshot as we should be able to turn them off at runtime. Re-installing | 3266 // snapshot as we should be able to turn them off at runtime. Re-installing |
| 3235 // them after they have already been deserialized would also fail. | 3267 // them after they have already been deserialized would also fail. |
| 3236 if (context_type == FULL_CONTEXT) { | 3268 if (context_type == FULL_CONTEXT) { |
| 3237 if (!isolate->serializer_enabled()) { | 3269 if (!isolate->serializer_enabled()) { |
| 3238 InitializeExperimentalGlobal(); | 3270 InitializeExperimentalGlobal(); |
| 3239 if (!InstallExperimentalNatives()) return; | 3271 if (!InstallExperimentalNatives()) return; |
| 3272 |
| 3273 if (FLAG_experimental_extras) { |
| 3274 if (!InstallExperimentalExtraNatives()) return; |
| 3275 } |
| 3276 |
| 3240 // By now the utils object is useless and can be removed. | 3277 // By now the utils object is useless and can be removed. |
| 3241 native_context()->set_natives_utils_object( | 3278 native_context()->set_natives_utils_object( |
| 3242 isolate->heap()->undefined_value()); | 3279 isolate->heap()->undefined_value()); |
| 3243 } | 3280 } |
| 3244 // The serializer cannot serialize typed arrays. Reset those typed arrays | 3281 // The serializer cannot serialize typed arrays. Reset those typed arrays |
| 3245 // for each new context. | 3282 // for each new context. |
| 3246 InitializeBuiltinTypedArrays(); | 3283 InitializeBuiltinTypedArrays(); |
| 3247 } else if (context_type == DEBUG_CONTEXT) { | 3284 } else if (context_type == DEBUG_CONTEXT) { |
| 3248 DCHECK(!isolate->serializer_enabled()); | 3285 DCHECK(!isolate->serializer_enabled()); |
| 3249 InitializeExperimentalGlobal(); | 3286 InitializeExperimentalGlobal(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3281 } | 3318 } |
| 3282 | 3319 |
| 3283 | 3320 |
| 3284 // Called when the top-level V8 mutex is destroyed. | 3321 // Called when the top-level V8 mutex is destroyed. |
| 3285 void Bootstrapper::FreeThreadResources() { | 3322 void Bootstrapper::FreeThreadResources() { |
| 3286 DCHECK(!IsActive()); | 3323 DCHECK(!IsActive()); |
| 3287 } | 3324 } |
| 3288 | 3325 |
| 3289 } // namespace internal | 3326 } // namespace internal |
| 3290 } // namespace v8 | 3327 } // namespace v8 |
| OLD | NEW |