| 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 void Bootstrapper::TearDown() { | 141 void Bootstrapper::TearDown() { |
| 142 DeleteNativeSources(isolate_->heap()->natives_source_cache()); | 142 DeleteNativeSources(isolate_->heap()->natives_source_cache()); |
| 143 DeleteNativeSources(isolate_->heap()->experimental_natives_source_cache()); | 143 DeleteNativeSources(isolate_->heap()->experimental_natives_source_cache()); |
| 144 DeleteNativeSources(isolate_->heap()->extra_natives_source_cache()); | 144 DeleteNativeSources(isolate_->heap()->extra_natives_source_cache()); |
| 145 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical | 145 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical |
| 146 } | 146 } |
| 147 | 147 |
| 148 | 148 |
| 149 class Genesis BASE_EMBEDDED { | 149 class Genesis BASE_EMBEDDED { |
| 150 public: | 150 public: |
| 151 Genesis(Isolate* isolate, | 151 Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy, |
| 152 MaybeHandle<JSGlobalProxy> maybe_global_proxy, | 152 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 153 v8::Handle<v8::ObjectTemplate> global_proxy_template, | |
| 154 v8::ExtensionConfiguration* extensions); | 153 v8::ExtensionConfiguration* extensions); |
| 155 ~Genesis() { } | 154 ~Genesis() { } |
| 156 | 155 |
| 157 Isolate* isolate() const { return isolate_; } | 156 Isolate* isolate() const { return isolate_; } |
| 158 Factory* factory() const { return isolate_->factory(); } | 157 Factory* factory() const { return isolate_->factory(); } |
| 159 Heap* heap() const { return isolate_->heap(); } | 158 Heap* heap() const { return isolate_->heap(); } |
| 160 | 159 |
| 161 Handle<Context> result() { return result_; } | 160 Handle<Context> result() { return result_; } |
| 162 | 161 |
| 163 private: | 162 private: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 178 // Make the "arguments" and "caller" properties throw a TypeError on access. | 177 // Make the "arguments" and "caller" properties throw a TypeError on access. |
| 179 void AddRestrictedFunctionProperties(Handle<Map> map); | 178 void AddRestrictedFunctionProperties(Handle<Map> map); |
| 180 | 179 |
| 181 // Creates the global objects using the global proxy and the template passed | 180 // Creates the global objects using the global proxy and the template passed |
| 182 // in through the API. We call this regardless of whether we are building a | 181 // in through the API. We call this regardless of whether we are building a |
| 183 // context from scratch or using a deserialized one from the partial snapshot | 182 // context from scratch or using a deserialized one from the partial snapshot |
| 184 // but in the latter case we don't use the objects it produces directly, as | 183 // but in the latter case we don't use the objects it produces directly, as |
| 185 // we have to used the deserialized ones that are linked together with the | 184 // we have to used the deserialized ones that are linked together with the |
| 186 // rest of the context snapshot. | 185 // rest of the context snapshot. |
| 187 Handle<GlobalObject> CreateNewGlobals( | 186 Handle<GlobalObject> CreateNewGlobals( |
| 188 v8::Handle<v8::ObjectTemplate> global_proxy_template, | 187 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 189 Handle<JSGlobalProxy> global_proxy); | 188 Handle<JSGlobalProxy> global_proxy); |
| 190 // Hooks the given global proxy into the context. If the context was created | 189 // Hooks the given global proxy into the context. If the context was created |
| 191 // by deserialization then this will unhook the global proxy that was | 190 // by deserialization then this will unhook the global proxy that was |
| 192 // deserialized, leaving the GC to pick it up. | 191 // deserialized, leaving the GC to pick it up. |
| 193 void HookUpGlobalProxy(Handle<GlobalObject> global_object, | 192 void HookUpGlobalProxy(Handle<GlobalObject> global_object, |
| 194 Handle<JSGlobalProxy> global_proxy); | 193 Handle<JSGlobalProxy> global_proxy); |
| 195 // Similarly, we want to use the global that has been created by the templates | 194 // Similarly, we want to use the global that has been created by the templates |
| 196 // passed through the API. The global from the snapshot is detached from the | 195 // passed through the API. The global from the snapshot is detached from the |
| 197 // other objects in the snapshot. | 196 // other objects in the snapshot. |
| 198 void HookUpGlobalObject(Handle<GlobalObject> global_object, | 197 void HookUpGlobalObject(Handle<GlobalObject> global_object, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 const char* name, | 266 const char* name, |
| 268 ExtensionStates* extension_states); | 267 ExtensionStates* extension_states); |
| 269 static bool InstallExtension(Isolate* isolate, | 268 static bool InstallExtension(Isolate* isolate, |
| 270 v8::RegisteredExtension* current, | 269 v8::RegisteredExtension* current, |
| 271 ExtensionStates* extension_states); | 270 ExtensionStates* extension_states); |
| 272 static bool InstallSpecialObjects(Handle<Context> native_context); | 271 static bool InstallSpecialObjects(Handle<Context> native_context); |
| 273 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); | 272 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); |
| 274 bool ConfigureApiObject(Handle<JSObject> object, | 273 bool ConfigureApiObject(Handle<JSObject> object, |
| 275 Handle<ObjectTemplateInfo> object_template); | 274 Handle<ObjectTemplateInfo> object_template); |
| 276 bool ConfigureGlobalObjects( | 275 bool ConfigureGlobalObjects( |
| 277 v8::Handle<v8::ObjectTemplate> global_proxy_template); | 276 v8::Local<v8::ObjectTemplate> global_proxy_template); |
| 278 | 277 |
| 279 // Migrates all properties from the 'from' object to the 'to' | 278 // Migrates all properties from the 'from' object to the 'to' |
| 280 // object and overrides the prototype in 'to' with the one from | 279 // object and overrides the prototype in 'to' with the one from |
| 281 // 'from'. | 280 // 'from'. |
| 282 void TransferObject(Handle<JSObject> from, Handle<JSObject> to); | 281 void TransferObject(Handle<JSObject> from, Handle<JSObject> to); |
| 283 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); | 282 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); |
| 284 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); | 283 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); |
| 285 | 284 |
| 286 enum FunctionMode { | 285 enum FunctionMode { |
| 287 // With prototype. | 286 // With prototype. |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 | 342 |
| 344 | 343 |
| 345 void Bootstrapper::Iterate(ObjectVisitor* v) { | 344 void Bootstrapper::Iterate(ObjectVisitor* v) { |
| 346 extensions_cache_.Iterate(v); | 345 extensions_cache_.Iterate(v); |
| 347 v->Synchronize(VisitorSynchronization::kExtensions); | 346 v->Synchronize(VisitorSynchronization::kExtensions); |
| 348 } | 347 } |
| 349 | 348 |
| 350 | 349 |
| 351 Handle<Context> Bootstrapper::CreateEnvironment( | 350 Handle<Context> Bootstrapper::CreateEnvironment( |
| 352 MaybeHandle<JSGlobalProxy> maybe_global_proxy, | 351 MaybeHandle<JSGlobalProxy> maybe_global_proxy, |
| 353 v8::Handle<v8::ObjectTemplate> global_proxy_template, | 352 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 354 v8::ExtensionConfiguration* extensions) { | 353 v8::ExtensionConfiguration* extensions) { |
| 355 HandleScope scope(isolate_); | 354 HandleScope scope(isolate_); |
| 356 Genesis genesis( | 355 Genesis genesis( |
| 357 isolate_, maybe_global_proxy, global_proxy_template, extensions); | 356 isolate_, maybe_global_proxy, global_proxy_template, extensions); |
| 358 Handle<Context> env = genesis.result(); | 357 Handle<Context> env = genesis.result(); |
| 359 if (env.is_null() || !InstallExtensions(env, extensions)) { | 358 if (env.is_null() || !InstallExtensions(env, extensions)) { |
| 360 return Handle<Context>(); | 359 return Handle<Context>(); |
| 361 } | 360 } |
| 362 return scope.CloseAndEscape(env); | 361 return scope.CloseAndEscape(env); |
| 363 } | 362 } |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 if (slot >= 0) { | 847 if (slot >= 0) { |
| 849 DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS); | 848 DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS); |
| 850 context->set(slot, native_context()->global_proxy()); | 849 context->set(slot, native_context()->global_proxy()); |
| 851 } | 850 } |
| 852 } | 851 } |
| 853 } | 852 } |
| 854 } | 853 } |
| 855 | 854 |
| 856 | 855 |
| 857 Handle<GlobalObject> Genesis::CreateNewGlobals( | 856 Handle<GlobalObject> Genesis::CreateNewGlobals( |
| 858 v8::Handle<v8::ObjectTemplate> global_proxy_template, | 857 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 859 Handle<JSGlobalProxy> global_proxy) { | 858 Handle<JSGlobalProxy> global_proxy) { |
| 860 // The argument global_proxy_template aka data is an ObjectTemplateInfo. | 859 // The argument global_proxy_template aka data is an ObjectTemplateInfo. |
| 861 // It has a constructor pointer that points at global_constructor which is a | 860 // It has a constructor pointer that points at global_constructor which is a |
| 862 // FunctionTemplateInfo. | 861 // FunctionTemplateInfo. |
| 863 // The global_proxy_constructor is used to (re)initialize the | 862 // The global_proxy_constructor is used to (re)initialize the |
| 864 // global_proxy. The global_proxy_constructor also has a prototype_template | 863 // global_proxy. The global_proxy_constructor also has a prototype_template |
| 865 // pointer that points at js_global_object_template which is an | 864 // pointer that points at js_global_object_template which is an |
| 866 // ObjectTemplateInfo. | 865 // ObjectTemplateInfo. |
| 867 // That in turn has a constructor pointer that points at | 866 // That in turn has a constructor pointer that points at |
| 868 // js_global_object_constructor which is a FunctionTemplateInfo. | 867 // js_global_object_constructor which is a FunctionTemplateInfo. |
| (...skipping 1982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 Handle<Object> function_object = Object::GetProperty( | 2850 Handle<Object> function_object = Object::GetProperty( |
| 2852 isolate(), builtins, Builtins::GetName(id)).ToHandleChecked(); | 2851 isolate(), builtins, Builtins::GetName(id)).ToHandleChecked(); |
| 2853 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 2852 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); |
| 2854 builtins->set_javascript_builtin(id, *function); | 2853 builtins->set_javascript_builtin(id, *function); |
| 2855 } | 2854 } |
| 2856 return true; | 2855 return true; |
| 2857 } | 2856 } |
| 2858 | 2857 |
| 2859 | 2858 |
| 2860 bool Genesis::ConfigureGlobalObjects( | 2859 bool Genesis::ConfigureGlobalObjects( |
| 2861 v8::Handle<v8::ObjectTemplate> global_proxy_template) { | 2860 v8::Local<v8::ObjectTemplate> global_proxy_template) { |
| 2862 Handle<JSObject> global_proxy( | 2861 Handle<JSObject> global_proxy( |
| 2863 JSObject::cast(native_context()->global_proxy())); | 2862 JSObject::cast(native_context()->global_proxy())); |
| 2864 Handle<JSObject> global_object( | 2863 Handle<JSObject> global_object( |
| 2865 JSObject::cast(native_context()->global_object())); | 2864 JSObject::cast(native_context()->global_object())); |
| 2866 | 2865 |
| 2867 if (!global_proxy_template.IsEmpty()) { | 2866 if (!global_proxy_template.IsEmpty()) { |
| 2868 // Configure the global proxy object. | 2867 // Configure the global proxy object. |
| 2869 Handle<ObjectTemplateInfo> global_proxy_data = | 2868 Handle<ObjectTemplateInfo> global_proxy_data = |
| 2870 v8::Utils::OpenHandle(*global_proxy_template); | 2869 v8::Utils::OpenHandle(*global_proxy_template); |
| 2871 if (!ConfigureApiObject(global_proxy, global_proxy_data)) return false; | 2870 if (!ConfigureApiObject(global_proxy, global_proxy_data)) return false; |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3072 } | 3071 } |
| 3073 | 3072 |
| 3074 private: | 3073 private: |
| 3075 bool flag_; | 3074 bool flag_; |
| 3076 bool enabled_; | 3075 bool enabled_; |
| 3077 }; | 3076 }; |
| 3078 | 3077 |
| 3079 | 3078 |
| 3080 Genesis::Genesis(Isolate* isolate, | 3079 Genesis::Genesis(Isolate* isolate, |
| 3081 MaybeHandle<JSGlobalProxy> maybe_global_proxy, | 3080 MaybeHandle<JSGlobalProxy> maybe_global_proxy, |
| 3082 v8::Handle<v8::ObjectTemplate> global_proxy_template, | 3081 v8::Local<v8::ObjectTemplate> global_proxy_template, |
| 3083 v8::ExtensionConfiguration* extensions) | 3082 v8::ExtensionConfiguration* extensions) |
| 3084 : isolate_(isolate), | 3083 : isolate_(isolate), active_(isolate->bootstrapper()) { |
| 3085 active_(isolate->bootstrapper()) { | |
| 3086 NoTrackDoubleFieldsForSerializerScope disable_scope(isolate); | 3084 NoTrackDoubleFieldsForSerializerScope disable_scope(isolate); |
| 3087 result_ = Handle<Context>::null(); | 3085 result_ = Handle<Context>::null(); |
| 3088 // Before creating the roots we must save the context and restore it | 3086 // Before creating the roots we must save the context and restore it |
| 3089 // on all function exits. | 3087 // on all function exits. |
| 3090 SaveContext saved_context(isolate); | 3088 SaveContext saved_context(isolate); |
| 3091 | 3089 |
| 3092 // During genesis, the boilerplate for stack overflow won't work until the | 3090 // During genesis, the boilerplate for stack overflow won't work until the |
| 3093 // environment has been at least partially initialized. Add a stack check | 3091 // environment has been at least partially initialized. Add a stack check |
| 3094 // before entering JS code to catch overflow early. | 3092 // before entering JS code to catch overflow early. |
| 3095 StackLimitCheck check(isolate); | 3093 StackLimitCheck check(isolate); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3200 } | 3198 } |
| 3201 | 3199 |
| 3202 | 3200 |
| 3203 // Called when the top-level V8 mutex is destroyed. | 3201 // Called when the top-level V8 mutex is destroyed. |
| 3204 void Bootstrapper::FreeThreadResources() { | 3202 void Bootstrapper::FreeThreadResources() { |
| 3205 DCHECK(!IsActive()); | 3203 DCHECK(!IsActive()); |
| 3206 } | 3204 } |
| 3207 | 3205 |
| 3208 } // namespace internal | 3206 } // namespace internal |
| 3209 } // namespace v8 | 3207 } // namespace v8 |
| OLD | NEW |