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

Unified Diff: src/api.cc

Issue 2636903002: Assert that context creation doesn't throw (Closed)
Patch Set: Created 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/assert-scope.h » ('j') | src/execution.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index 927ff012f7740e4afd3a4c3e6f837f2fb4e68787..0ec03484a64f3c0398bd36d76268c7e91e192422 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);
Yang 2017/01/17 09:54:23 What about stack overflow, which trigger RangeErro
jochen (gone - plz use gerrit) 2017/01/17 10:24:01 we'd just swallow the exception and return an empt
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,25 @@ static i::Handle<ObjectType> CreateEnvironment(
global_constructor->set_access_check_info(
isolate->heap()->undefined_value());
}
+
+ // Same for other interceptors.
+ if (!global_constructor->named_property_handler()->IsUndefined(isolate)) {
+ named_interceptor =
+ handle(global_constructor->named_property_handler(), isolate);
+ auto obj = CreateInterceptorInfo(
+ isolate, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, Local<Value>(), PropertyHandlerFlags::kNone);
Yang 2017/01/17 09:54:22 Do we want a canonical no-op interceptor info, cre
jochen (gone - plz use gerrit) 2017/01/17 10:24:01 done
+ global_constructor->set_named_property_handler(*obj);
+ }
+ if (!global_constructor->indexed_property_handler()->IsUndefined(
+ isolate)) {
+ indexed_interceptor =
+ handle(global_constructor->indexed_property_handler(), isolate);
+ auto obj = CreateInterceptorInfo(
+ isolate, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, Local<Value>(), PropertyHandlerFlags::kNone);
+ global_constructor->set_indexed_property_handler(*obj);
+ }
}
i::MaybeHandle<i::JSGlobalProxy> maybe_proxy;
@@ -6254,7 +6280,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 +6288,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.
« no previous file with comments | « no previous file | src/assert-scope.h » ('j') | src/execution.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698