Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 927ff012f7740e4afd3a4c3e6f837f2fb4e68787..a6007fde64abc91e73af4bffbb65e24d85ab3dac 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -151,6 +151,10 @@ namespace v8 { |
PREPARE_FOR_EXECUTION_WITH_CONTEXT(context, class_name, function_name, \ |
false, i::HandleScope, false) |
+#define ENTER_V8_FOR_NEW_CONTEXT(isolate) \ |
+ i::VMState<v8::OTHER> __state__((isolate)); \ |
+ i::DisallowExceptions __no_exceptions__((isolate)) |
+ |
#define EXCEPTION_BAILOUT_CHECK_SCOPED(isolate, value) \ |
do { \ |
if (has_pending_exception) { \ |
@@ -6203,12 +6207,15 @@ static i::Handle<ObjectType> CreateEnvironment( |
v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { |
i::Handle<ObjectType> result; |
- // Enter V8 via an ENTER_V8 scope. |
{ |
- ENTER_V8(isolate); |
+ ENTER_V8_FOR_NEW_CONTEXT(isolate); |
v8::Local<ObjectTemplate> proxy_template; |
i::Handle<i::FunctionTemplateInfo> proxy_constructor; |
i::Handle<i::FunctionTemplateInfo> global_constructor; |
+ i::Handle<i::Object> named_interceptor( |
+ isolate->factory()->undefined_value()); |
+ i::Handle<i::Object> indexed_interceptor( |
+ isolate->factory()->undefined_value()); |
if (!maybe_global_template.IsEmpty()) { |
v8::Local<v8::ObjectTemplate> global_template = |
@@ -6241,6 +6248,24 @@ static i::Handle<ObjectType> CreateEnvironment( |
global_constructor->set_access_check_info( |
isolate->heap()->undefined_value()); |
} |
+ |
+ // Same for other interceptors. If the global constructor has |
+ // interceptors, we need to replace them temporarily with noop |
+ // interceptors, so the map is correctly marked as having interceptors, |
+ // but we don't invoke any. |
+ if (!global_constructor->named_property_handler()->IsUndefined(isolate)) { |
+ named_interceptor = |
+ handle(global_constructor->named_property_handler(), isolate); |
+ global_constructor->set_named_property_handler( |
+ isolate->heap()->noop_interceptor_info()); |
+ } |
+ if (!global_constructor->indexed_property_handler()->IsUndefined( |
+ isolate)) { |
+ indexed_interceptor = |
+ handle(global_constructor->indexed_property_handler(), isolate); |
+ global_constructor->set_indexed_property_handler( |
+ isolate->heap()->noop_interceptor_info()); |
+ } |
} |
i::MaybeHandle<i::JSGlobalProxy> maybe_proxy; |
@@ -6254,7 +6279,7 @@ static i::Handle<ObjectType> CreateEnvironment( |
invoke.Invoke(isolate, maybe_proxy, proxy_template, extensions, |
context_snapshot_index, internal_fields_deserializer); |
- // Restore the access check info on the global template. |
+ // Restore the access check info and interceptors on the global template. |
if (!maybe_global_template.IsEmpty()) { |
DCHECK(!global_constructor.is_null()); |
DCHECK(!proxy_constructor.is_null()); |
@@ -6262,6 +6287,8 @@ static i::Handle<ObjectType> CreateEnvironment( |
proxy_constructor->access_check_info()); |
global_constructor->set_needs_access_check( |
proxy_constructor->needs_access_check()); |
+ global_constructor->set_named_property_handler(*named_interceptor); |
+ global_constructor->set_indexed_property_handler(*indexed_interceptor); |
} |
} |
// Leave V8. |