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

Side by Side Diff: src/bootstrapper.cc

Issue 1178903003: Add script context with context-allocated "const this" (Closed) Base URL: https://chromium.googlesource.com/v8/v8@master
Patch Set: Add test Created 5 years, 6 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 | « src/arm64/full-codegen-arm64.cc ('k') | src/compiler/ast-graph-builder.cc » ('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/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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 // Hooks the given global proxy into the context. If the context was created 190 // 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 191 // by deserialization then this will unhook the global proxy that was
192 // deserialized, leaving the GC to pick it up. 192 // deserialized, leaving the GC to pick it up.
193 void HookUpGlobalProxy(Handle<GlobalObject> global_object, 193 void HookUpGlobalProxy(Handle<GlobalObject> global_object,
194 Handle<JSGlobalProxy> global_proxy); 194 Handle<JSGlobalProxy> global_proxy);
195 // Similarly, we want to use the global that has been created by the templates 195 // 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 196 // passed through the API. The global from the snapshot is detached from the
197 // other objects in the snapshot. 197 // other objects in the snapshot.
198 void HookUpGlobalObject(Handle<GlobalObject> global_object, 198 void HookUpGlobalObject(Handle<GlobalObject> global_object,
199 Handle<FixedArray> outdated_contexts); 199 Handle<FixedArray> outdated_contexts);
200 // The native context has a ScriptContextTable that store declarative bindings
201 // made in script scopes. Add a "this" binding to that table pointing to the
202 // global proxy.
203 void InstallGlobalThisBinding();
204 void HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts);
200 // New context initialization. Used for creating a context from scratch. 205 // New context initialization. Used for creating a context from scratch.
201 void InitializeGlobal(Handle<GlobalObject> global_object, 206 void InitializeGlobal(Handle<GlobalObject> global_object,
202 Handle<JSFunction> empty_function); 207 Handle<JSFunction> empty_function);
203 void InitializeExperimentalGlobal(); 208 void InitializeExperimentalGlobal();
204 // Installs the contents of the native .js files on the global objects. 209 // Installs the contents of the native .js files on the global objects.
205 // Used for creating a context from scratch. 210 // Used for creating a context from scratch.
206 void InstallNativeFunctions(); 211 void InstallNativeFunctions();
207 void InstallExperimentalNativeFunctions(); 212 void InstallExperimentalNativeFunctions();
208 // Typed arrays are not serializable and have to initialized afterwards. 213 // Typed arrays are not serializable and have to initialized afterwards.
209 void InitializeBuiltinTypedArrays(); 214 void InitializeBuiltinTypedArrays();
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 isolate()->set_context(*native_context()); 812 isolate()->set_context(*native_context());
808 813
809 // Allocate the message listeners object. 814 // Allocate the message listeners object.
810 { 815 {
811 v8::NeanderArray listeners(isolate()); 816 v8::NeanderArray listeners(isolate());
812 native_context()->set_message_listeners(*listeners.value()); 817 native_context()->set_message_listeners(*listeners.value());
813 } 818 }
814 } 819 }
815 820
816 821
822 void Genesis::InstallGlobalThisBinding() {
823 Handle<ScriptContextTable> script_contexts(
824 native_context()->script_context_table());
825 Handle<ScopeInfo> scope_info = ScopeInfo::CreateGlobalThisBinding(isolate());
826 Handle<JSFunction> closure(native_context()->closure());
827 Handle<Context> context = factory()->NewScriptContext(closure, scope_info);
828
829 // Go ahead and hook it up while we're at it.
830 int slot = scope_info->ReceiverContextSlotIndex();
831 DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS);
832 context->set(slot, native_context()->global_proxy());
833
834 Handle<ScriptContextTable> new_script_contexts =
835 ScriptContextTable::Extend(script_contexts, context);
836 native_context()->set_script_context_table(*new_script_contexts);
837 }
838
839
840 void Genesis::HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts) {
841 // One of these contexts should be the one that declares the global "this"
842 // binding.
843 for (int i = 0; i < outdated_contexts->length(); ++i) {
844 Context* context = Context::cast(outdated_contexts->get(i));
845 if (context->IsScriptContext()) {
846 ScopeInfo* scope_info = ScopeInfo::cast(context->extension());
847 int slot = scope_info->ReceiverContextSlotIndex();
848 if (slot >= 0) {
849 DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS);
850 context->set(slot, native_context()->global_proxy());
851 }
852 }
853 }
854 }
855
856
817 Handle<GlobalObject> Genesis::CreateNewGlobals( 857 Handle<GlobalObject> Genesis::CreateNewGlobals(
818 v8::Handle<v8::ObjectTemplate> global_proxy_template, 858 v8::Handle<v8::ObjectTemplate> global_proxy_template,
819 Handle<JSGlobalProxy> global_proxy) { 859 Handle<JSGlobalProxy> global_proxy) {
820 // The argument global_proxy_template aka data is an ObjectTemplateInfo. 860 // The argument global_proxy_template aka data is an ObjectTemplateInfo.
821 // It has a constructor pointer that points at global_constructor which is a 861 // It has a constructor pointer that points at global_constructor which is a
822 // FunctionTemplateInfo. 862 // FunctionTemplateInfo.
823 // The global_proxy_constructor is used to (re)initialize the 863 // The global_proxy_constructor is used to (re)initialize the
824 // global_proxy. The global_proxy_constructor also has a prototype_template 864 // global_proxy. The global_proxy_constructor also has a prototype_template
825 // pointer that points at js_global_object_template which is an 865 // pointer that points at js_global_object_template which is an
826 // ObjectTemplateInfo. 866 // ObjectTemplateInfo.
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 // by default even in case of global object reinitialization. 1005 // by default even in case of global object reinitialization.
966 native_context()->set_security_token(*global_object); 1006 native_context()->set_security_token(*global_object);
967 1007
968 Isolate* isolate = global_object->GetIsolate(); 1008 Isolate* isolate = global_object->GetIsolate();
969 Factory* factory = isolate->factory(); 1009 Factory* factory = isolate->factory();
970 Heap* heap = isolate->heap(); 1010 Heap* heap = isolate->heap();
971 1011
972 Handle<ScriptContextTable> script_context_table = 1012 Handle<ScriptContextTable> script_context_table =
973 factory->NewScriptContextTable(); 1013 factory->NewScriptContextTable();
974 native_context()->set_script_context_table(*script_context_table); 1014 native_context()->set_script_context_table(*script_context_table);
1015 InstallGlobalThisBinding();
975 1016
976 Handle<String> object_name = factory->Object_string(); 1017 Handle<String> object_name = factory->Object_string();
977 JSObject::AddProperty( 1018 JSObject::AddProperty(
978 global_object, object_name, isolate->object_function(), DONT_ENUM); 1019 global_object, object_name, isolate->object_function(), DONT_ENUM);
979 1020
980 Handle<JSObject> global(native_context()->global_object()); 1021 Handle<JSObject> global(native_context()->global_object());
981 1022
982 // Install global Function object 1023 // Install global Function object
983 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, 1024 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
984 empty_function, Builtins::kIllegal); 1025 empty_function, Builtins::kIllegal);
(...skipping 2094 matching lines...) Expand 10 before | Expand all | Expand 10 after
3079 Map::TraceAllTransitions(object_fun->initial_map()); 3120 Map::TraceAllTransitions(object_fun->initial_map());
3080 } 3121 }
3081 #endif 3122 #endif
3082 Handle<GlobalObject> global_object = 3123 Handle<GlobalObject> global_object =
3083 CreateNewGlobals(global_proxy_template, global_proxy); 3124 CreateNewGlobals(global_proxy_template, global_proxy);
3084 3125
3085 HookUpGlobalProxy(global_object, global_proxy); 3126 HookUpGlobalProxy(global_object, global_proxy);
3086 HookUpGlobalObject(global_object, outdated_contexts); 3127 HookUpGlobalObject(global_object, outdated_contexts);
3087 native_context()->builtins()->set_global_proxy( 3128 native_context()->builtins()->set_global_proxy(
3088 native_context()->global_proxy()); 3129 native_context()->global_proxy());
3130 HookUpGlobalThisBinding(outdated_contexts);
3089 3131
3090 if (!ConfigureGlobalObjects(global_proxy_template)) return; 3132 if (!ConfigureGlobalObjects(global_proxy_template)) return;
3091 } else { 3133 } else {
3092 // We get here if there was no context snapshot. 3134 // We get here if there was no context snapshot.
3093 CreateRoots(); 3135 CreateRoots();
3094 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); 3136 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
3095 CreateStrictModeFunctionMaps(empty_function); 3137 CreateStrictModeFunctionMaps(empty_function);
3096 CreateStrongModeFunctionMaps(empty_function); 3138 CreateStrongModeFunctionMaps(empty_function);
3097 Handle<GlobalObject> global_object = 3139 Handle<GlobalObject> global_object =
3098 CreateNewGlobals(global_proxy_template, global_proxy); 3140 CreateNewGlobals(global_proxy_template, global_proxy);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3148 } 3190 }
3149 3191
3150 3192
3151 // Called when the top-level V8 mutex is destroyed. 3193 // Called when the top-level V8 mutex is destroyed.
3152 void Bootstrapper::FreeThreadResources() { 3194 void Bootstrapper::FreeThreadResources() {
3153 DCHECK(!IsActive()); 3195 DCHECK(!IsActive());
3154 } 3196 }
3155 3197
3156 } // namespace internal 3198 } // namespace internal
3157 } // namespace v8 3199 } // namespace v8
OLDNEW
« no previous file with comments | « src/arm64/full-codegen-arm64.cc ('k') | src/compiler/ast-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698