| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index e72abc87de14ecf523fe5d892b694287db3cbc26..131645cbb63684051101274df21dc135a4754876 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -1535,20 +1535,12 @@ void ObjectTemplate::SetAccessor(v8::Local<Name> name,
|
| signature, i::FLAG_disable_old_api_accessors);
|
| }
|
|
|
| -
|
| template <typename Getter, typename Setter, typename Query, typename Deleter,
|
| typename Enumerator>
|
| -static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
|
| - Getter getter, Setter setter,
|
| - Query query, Deleter remover,
|
| - Enumerator enumerator,
|
| - Local<Value> data,
|
| - PropertyHandlerFlags flags) {
|
| - i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
|
| - ENTER_V8(isolate);
|
| - i::HandleScope scope(isolate);
|
| - auto cons = EnsureConstructor(isolate, templ);
|
| - EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
|
| +static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
|
| + i::Isolate* isolate, Getter getter, Setter setter, Query query,
|
| + Deleter remover, Enumerator enumerator, Local<Value> data,
|
| + PropertyHandlerFlags flags) {
|
| auto obj = i::Handle<i::InterceptorInfo>::cast(
|
| isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
|
| obj->set_flags(0);
|
| @@ -1570,6 +1562,24 @@ static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
|
| data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
|
| }
|
| obj->set_data(*Utils::OpenHandle(*data));
|
| + return obj;
|
| +}
|
| +
|
| +template <typename Getter, typename Setter, typename Query, typename Deleter,
|
| + typename Enumerator>
|
| +static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
|
| + Getter getter, Setter setter,
|
| + Query query, Deleter remover,
|
| + Enumerator enumerator,
|
| + Local<Value> data,
|
| + PropertyHandlerFlags flags) {
|
| + i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
|
| + ENTER_V8(isolate);
|
| + i::HandleScope scope(isolate);
|
| + auto cons = EnsureConstructor(isolate, templ);
|
| + EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
|
| + auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover,
|
| + enumerator, data, flags);
|
| cons->set_named_property_handler(*obj);
|
| }
|
|
|
| @@ -1616,6 +1626,8 @@ void ObjectTemplate::SetAccessCheckCallback(AccessCheckCallback callback,
|
| i::Handle<i::AccessCheckInfo>::cast(struct_info);
|
|
|
| SET_FIELD_WRAPPED(info, set_callback, callback);
|
| + info->set_named_interceptor(nullptr);
|
| + info->set_indexed_interceptor(nullptr);
|
|
|
| if (data.IsEmpty()) {
|
| data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
|
| @@ -1626,32 +1638,54 @@ void ObjectTemplate::SetAccessCheckCallback(AccessCheckCallback callback,
|
| cons->set_needs_access_check(true);
|
| }
|
|
|
| -void ObjectTemplate::SetHandler(
|
| - const IndexedPropertyHandlerConfiguration& config) {
|
| +void ObjectTemplate::SetAccessCheckCallbackAndHandler(
|
| + AccessCheckCallback callback,
|
| + const NamedPropertyHandlerConfiguration& named_handler,
|
| + const IndexedPropertyHandlerConfiguration& indexed_handler,
|
| + Local<Value> data) {
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| auto cons = EnsureConstructor(isolate, this);
|
| - EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
|
| - auto obj = i::Handle<i::InterceptorInfo>::cast(
|
| - isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
|
| - obj->set_flags(0);
|
| + EnsureNotInstantiated(
|
| + cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler");
|
|
|
| - if (config.getter != 0) SET_FIELD_WRAPPED(obj, set_getter, config.getter);
|
| - if (config.setter != 0) SET_FIELD_WRAPPED(obj, set_setter, config.setter);
|
| - if (config.query != 0) SET_FIELD_WRAPPED(obj, set_query, config.query);
|
| - if (config.deleter != 0) SET_FIELD_WRAPPED(obj, set_deleter, config.deleter);
|
| - if (config.enumerator != 0) {
|
| - SET_FIELD_WRAPPED(obj, set_enumerator, config.enumerator);
|
| - }
|
| - obj->set_all_can_read(static_cast<int>(config.flags) &
|
| - static_cast<int>(PropertyHandlerFlags::kAllCanRead));
|
| + i::Handle<i::Struct> struct_info =
|
| + isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
|
| + i::Handle<i::AccessCheckInfo> info =
|
| + i::Handle<i::AccessCheckInfo>::cast(struct_info);
|
| +
|
| + SET_FIELD_WRAPPED(info, set_callback, callback);
|
| + auto named_interceptor = CreateInterceptorInfo(
|
| + isolate, named_handler.getter, named_handler.setter, named_handler.query,
|
| + named_handler.deleter, named_handler.enumerator, named_handler.data,
|
| + named_handler.flags);
|
| + info->set_named_interceptor(*named_interceptor);
|
| + auto indexed_interceptor = CreateInterceptorInfo(
|
| + isolate, indexed_handler.getter, indexed_handler.setter,
|
| + indexed_handler.query, indexed_handler.deleter,
|
| + indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags);
|
| + info->set_indexed_interceptor(*indexed_interceptor);
|
|
|
| - v8::Local<v8::Value> data = config.data;
|
| if (data.IsEmpty()) {
|
| data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
|
| }
|
| - obj->set_data(*Utils::OpenHandle(*data));
|
| + info->set_data(*Utils::OpenHandle(*data));
|
| +
|
| + cons->set_access_check_info(*info);
|
| + cons->set_needs_access_check(true);
|
| +}
|
| +
|
| +void ObjectTemplate::SetHandler(
|
| + const IndexedPropertyHandlerConfiguration& config) {
|
| + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + ENTER_V8(isolate);
|
| + i::HandleScope scope(isolate);
|
| + auto cons = EnsureConstructor(isolate, this);
|
| + EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
|
| + auto obj = CreateInterceptorInfo(
|
| + isolate, config.getter, config.setter, config.query, config.deleter,
|
| + config.enumerator, config.data, config.flags);
|
| cons->set_indexed_property_handler(*obj);
|
| }
|
|
|
|
|