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

Side by Side Diff: src/bootstrapper.cc

Issue 846023002: Update references to global object after deserializing context. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments Created 5 years, 11 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
« no previous file with comments | « no previous file | src/serialize.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/extensions/externalize-string-extension.h" 9 #include "src/extensions/externalize-string-extension.h"
10 #include "src/extensions/free-buffer-extension.h" 10 #include "src/extensions/free-buffer-extension.h"
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 MaybeHandle<JSGlobalProxy> maybe_global_proxy, 194 MaybeHandle<JSGlobalProxy> maybe_global_proxy,
195 Handle<GlobalObject>* global_object_out); 195 Handle<GlobalObject>* global_object_out);
196 // Hooks the given global proxy into the context. If the context was created 196 // Hooks the given global proxy into the context. If the context was created
197 // by deserialization then this will unhook the global proxy that was 197 // by deserialization then this will unhook the global proxy that was
198 // deserialized, leaving the GC to pick it up. 198 // deserialized, leaving the GC to pick it up.
199 void HookUpGlobalProxy(Handle<GlobalObject> global_object, 199 void HookUpGlobalProxy(Handle<GlobalObject> global_object,
200 Handle<JSGlobalProxy> global_proxy); 200 Handle<JSGlobalProxy> global_proxy);
201 // Similarly, we want to use the global that has been created by the templates 201 // Similarly, we want to use the global that has been created by the templates
202 // passed through the API. The global from the snapshot is detached from the 202 // passed through the API. The global from the snapshot is detached from the
203 // other objects in the snapshot. 203 // other objects in the snapshot.
204 void HookUpGlobalObject(Handle<GlobalObject> global_object); 204 void HookUpGlobalObject(Handle<GlobalObject> global_object,
205 Handle<FixedArray> outdated_contexts);
205 // New context initialization. Used for creating a context from scratch. 206 // New context initialization. Used for creating a context from scratch.
206 void InitializeGlobal(Handle<GlobalObject> global_object, 207 void InitializeGlobal(Handle<GlobalObject> global_object,
207 Handle<JSFunction> empty_function); 208 Handle<JSFunction> empty_function);
208 void InitializeExperimentalGlobal(); 209 void InitializeExperimentalGlobal();
209 // Installs the contents of the native .js files on the global objects. 210 // Installs the contents of the native .js files on the global objects.
210 // Used for creating a context from scratch. 211 // Used for creating a context from scratch.
211 void InstallNativeFunctions(); 212 void InstallNativeFunctions();
212 void InstallExperimentalNativeFunctions(); 213 void InstallExperimentalNativeFunctions();
213 214
214 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ 215 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 void Genesis::HookUpGlobalProxy(Handle<GlobalObject> global_object, 865 void Genesis::HookUpGlobalProxy(Handle<GlobalObject> global_object,
865 Handle<JSGlobalProxy> global_proxy) { 866 Handle<JSGlobalProxy> global_proxy) {
866 // Set the native context for the global object. 867 // Set the native context for the global object.
867 global_object->set_native_context(*native_context()); 868 global_object->set_native_context(*native_context());
868 global_object->set_global_proxy(*global_proxy); 869 global_object->set_global_proxy(*global_proxy);
869 global_proxy->set_native_context(*native_context()); 870 global_proxy->set_native_context(*native_context());
870 native_context()->set_global_proxy(*global_proxy); 871 native_context()->set_global_proxy(*global_proxy);
871 } 872 }
872 873
873 874
874 void Genesis::HookUpGlobalObject(Handle<GlobalObject> global_object) { 875 void Genesis::HookUpGlobalObject(Handle<GlobalObject> global_object,
876 Handle<FixedArray> outdated_contexts) {
875 Handle<GlobalObject> global_object_from_snapshot( 877 Handle<GlobalObject> global_object_from_snapshot(
876 GlobalObject::cast(native_context()->extension())); 878 GlobalObject::cast(native_context()->extension()));
877 Handle<JSBuiltinsObject> builtins_global(native_context()->builtins()); 879 Handle<JSBuiltinsObject> builtins_global(native_context()->builtins());
878 native_context()->set_extension(*global_object); 880 native_context()->set_extension(*global_object);
879 native_context()->set_global_object(*global_object);
880 native_context()->set_security_token(*global_object); 881 native_context()->set_security_token(*global_object);
882
883 // Replace outdated global objects in deserialized contexts.
884 for (int i = 0; i < outdated_contexts->length(); ++i) {
885 Context* context = Context::cast(outdated_contexts->get(i));
886 DCHECK_EQ(context->global_object(), *global_object_from_snapshot);
887 context->set_global_object(*global_object);
888 }
889
881 static const PropertyAttributes attributes = 890 static const PropertyAttributes attributes =
882 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); 891 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
883 Runtime::DefineObjectProperty(builtins_global, factory()->global_string(), 892 Runtime::DefineObjectProperty(builtins_global, factory()->global_string(),
884 global_object, attributes).Assert(); 893 global_object, attributes).Assert();
885 // Set up the reference from the global object to the builtins object. 894 // Set up the reference from the global object to the builtins object.
886 JSGlobalObject::cast(*global_object)->set_builtins(*builtins_global); 895 JSGlobalObject::cast(*global_object)->set_builtins(*builtins_global);
887 TransferNamedProperties(global_object_from_snapshot, global_object); 896 TransferNamedProperties(global_object_from_snapshot, global_object);
888 TransferIndexedProperties(global_object_from_snapshot, global_object); 897 TransferIndexedProperties(global_object_from_snapshot, global_object);
889 } 898 }
890 899
(...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after
2717 SaveContext saved_context(isolate); 2726 SaveContext saved_context(isolate);
2718 2727
2719 // During genesis, the boilerplate for stack overflow won't work until the 2728 // During genesis, the boilerplate for stack overflow won't work until the
2720 // environment has been at least partially initialized. Add a stack check 2729 // environment has been at least partially initialized. Add a stack check
2721 // before entering JS code to catch overflow early. 2730 // before entering JS code to catch overflow early.
2722 StackLimitCheck check(isolate); 2731 StackLimitCheck check(isolate);
2723 if (check.HasOverflowed()) return; 2732 if (check.HasOverflowed()) return;
2724 2733
2725 // We can only de-serialize a context if the isolate was initialized from 2734 // We can only de-serialize a context if the isolate was initialized from
2726 // a snapshot. Otherwise we have to build the context from scratch. 2735 // a snapshot. Otherwise we have to build the context from scratch.
2727 if (isolate->initialized_from_snapshot()) { 2736 Handle<FixedArray> outdated_contexts;
2728 native_context_ = Snapshot::NewContextFromSnapshot(isolate); 2737 if (!isolate->initialized_from_snapshot() ||
2729 } else { 2738 !Snapshot::NewContextFromSnapshot(isolate, &outdated_contexts)
2739 .ToHandle(&native_context_)) {
2730 native_context_ = Handle<Context>(); 2740 native_context_ = Handle<Context>();
2731 } 2741 }
2732 2742
2733 if (!native_context().is_null()) { 2743 if (!native_context().is_null()) {
2734 AddToWeakNativeContextList(*native_context()); 2744 AddToWeakNativeContextList(*native_context());
2735 isolate->set_context(*native_context()); 2745 isolate->set_context(*native_context());
2736 isolate->counters()->contexts_created_by_snapshot()->Increment(); 2746 isolate->counters()->contexts_created_by_snapshot()->Increment();
2737 #if TRACE_MAPS 2747 #if TRACE_MAPS
2738 if (FLAG_trace_maps) { 2748 if (FLAG_trace_maps) {
2739 Handle<JSFunction> object_fun = isolate->object_function(); 2749 Handle<JSFunction> object_fun = isolate->object_function();
2740 PrintF("[TraceMap: InitialMap map= %p SFI= %d_Object ]\n", 2750 PrintF("[TraceMap: InitialMap map= %p SFI= %d_Object ]\n",
2741 reinterpret_cast<void*>(object_fun->initial_map()), 2751 reinterpret_cast<void*>(object_fun->initial_map()),
2742 object_fun->shared()->unique_id()); 2752 object_fun->shared()->unique_id());
2743 Map::TraceAllTransitions(object_fun->initial_map()); 2753 Map::TraceAllTransitions(object_fun->initial_map());
2744 } 2754 }
2745 #endif 2755 #endif
2746 Handle<GlobalObject> global_object; 2756 Handle<GlobalObject> global_object;
2747 Handle<JSGlobalProxy> global_proxy = CreateNewGlobals( 2757 Handle<JSGlobalProxy> global_proxy = CreateNewGlobals(
2748 global_proxy_template, maybe_global_proxy, &global_object); 2758 global_proxy_template, maybe_global_proxy, &global_object);
2749 2759
2750 HookUpGlobalProxy(global_object, global_proxy); 2760 HookUpGlobalProxy(global_object, global_proxy);
2751 HookUpGlobalObject(global_object); 2761 HookUpGlobalObject(global_object, outdated_contexts);
2752 native_context()->builtins()->set_global_proxy( 2762 native_context()->builtins()->set_global_proxy(
2753 native_context()->global_proxy()); 2763 native_context()->global_proxy());
2754 2764
2755 if (!ConfigureGlobalObjects(global_proxy_template)) return; 2765 if (!ConfigureGlobalObjects(global_proxy_template)) return;
2756 } else { 2766 } else {
2757 // We get here if there was no context snapshot. 2767 // We get here if there was no context snapshot.
2758 CreateRoots(); 2768 CreateRoots();
2759 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); 2769 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
2760 CreateStrictModeFunctionMaps(empty_function); 2770 CreateStrictModeFunctionMaps(empty_function);
2761 Handle<GlobalObject> global_object; 2771 Handle<GlobalObject> global_object;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2841 return from + sizeof(NestingCounterType); 2851 return from + sizeof(NestingCounterType);
2842 } 2852 }
2843 2853
2844 2854
2845 // Called when the top-level V8 mutex is destroyed. 2855 // Called when the top-level V8 mutex is destroyed.
2846 void Bootstrapper::FreeThreadResources() { 2856 void Bootstrapper::FreeThreadResources() {
2847 DCHECK(!IsActive()); 2857 DCHECK(!IsActive());
2848 } 2858 }
2849 2859
2850 } } // namespace v8::internal 2860 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/serialize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698