Commit 7c401bd8 authored by franzih's avatar franzih Committed by Commit bot

[api] Add interceptor for defineProperty().

With the Indexed/GenericNamedPropertyDefinerCallback it is possible to intercept Object.defineProperty() calls.

Requests that call JSReceiver::OrdinaryDefineOwnProperty() internally, also trigger the interceptor. This includes Object.freeze(), Object.preventExtensions(), and Object.seal().

As without this patch, the query interceptor triggers on
defineProperty, unless the definer callback
intercepts the request.

As without this patch, the query interceptor triggers on defineProperty, unless the definer callback intercepts the request.

BUG=

Committed: https://crrev.com/b9d985975cf3bab0ded0cec9fafd3799f9bde29a
Review-Url: https://codereview.chromium.org/2272383002
Cr-Original-Commit-Position: refs/heads/master@{#39094}
Cr-Commit-Position: refs/heads/master@{#39122}
parent 1cb2a70c
...@@ -4687,6 +4687,29 @@ typedef void (*GenericNamedPropertyDeleterCallback)( ...@@ -4687,6 +4687,29 @@ typedef void (*GenericNamedPropertyDeleterCallback)(
typedef void (*GenericNamedPropertyEnumeratorCallback)( typedef void (*GenericNamedPropertyEnumeratorCallback)(
const PropertyCallbackInfo<Array>& info); const PropertyCallbackInfo<Array>& info);
/**
* Interceptor for defineProperty requests on an object.
*
* Use `info.GetReturnValue()` to indicate whether the request was intercepted
* or not. If the definer successfully intercepts the request, i.e., if the
* request should not be further executed, call
* `info.GetReturnValue().Set(value)`. If the definer
* did not intercept the request, i.e., if the request should be handled as
* if no interceptor is present, do not not call `Set()`.
*
* \param property The name of the property for which the request was
* intercepted.
* \param desc The property descriptor which is used to define the
* property if the request is not intercepted.
* \param info Information about the intercepted request, such as
* isolate, receiver, return value, or whether running in `'use strict'` mode.
* See `PropertyCallbackInfo`.
*
* See also `ObjectTemplate::SetNamedPropertyHandler`.
*/
typedef void (*GenericNamedPropertyDefinerCallback)(
Local<Name> key, const PropertyDescriptor& desc,
const PropertyCallbackInfo<Value>& info);
/** /**
* Returns the value of the property if the getter intercepts the * Returns the value of the property if the getter intercepts the
...@@ -4733,6 +4756,9 @@ typedef void (*IndexedPropertyDeleterCallback)( ...@@ -4733,6 +4756,9 @@ typedef void (*IndexedPropertyDeleterCallback)(
typedef void (*IndexedPropertyEnumeratorCallback)( typedef void (*IndexedPropertyEnumeratorCallback)(
const PropertyCallbackInfo<Array>& info); const PropertyCallbackInfo<Array>& info);
typedef void (*IndexedPropertyDefinerCallback)(
uint32_t index, const PropertyDescriptor& desc,
const PropertyCallbackInfo<Value>& info);
/** /**
* Access type specification. * Access type specification.
...@@ -4995,6 +5021,25 @@ struct NamedPropertyHandlerConfiguration { ...@@ -4995,6 +5021,25 @@ struct NamedPropertyHandlerConfiguration {
query(query), query(query),
deleter(deleter), deleter(deleter),
enumerator(enumerator), enumerator(enumerator),
definer(0),
data(data),
flags(flags) {}
NamedPropertyHandlerConfiguration(
GenericNamedPropertyGetterCallback getter,
GenericNamedPropertySetterCallback setter,
GenericNamedPropertyQueryCallback query,
GenericNamedPropertyDeleterCallback deleter,
GenericNamedPropertyEnumeratorCallback enumerator,
GenericNamedPropertyDefinerCallback definer,
Local<Value> data = Local<Value>(),
PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
: getter(getter),
setter(setter),
query(query),
deleter(deleter),
enumerator(enumerator),
definer(definer),
data(data), data(data),
flags(flags) {} flags(flags) {}
...@@ -5003,6 +5048,7 @@ struct NamedPropertyHandlerConfiguration { ...@@ -5003,6 +5048,7 @@ struct NamedPropertyHandlerConfiguration {
GenericNamedPropertyQueryCallback query; GenericNamedPropertyQueryCallback query;
GenericNamedPropertyDeleterCallback deleter; GenericNamedPropertyDeleterCallback deleter;
GenericNamedPropertyEnumeratorCallback enumerator; GenericNamedPropertyEnumeratorCallback enumerator;
GenericNamedPropertyDefinerCallback definer;
Local<Value> data; Local<Value> data;
PropertyHandlerFlags flags; PropertyHandlerFlags flags;
}; };
...@@ -5023,6 +5069,24 @@ struct IndexedPropertyHandlerConfiguration { ...@@ -5023,6 +5069,24 @@ struct IndexedPropertyHandlerConfiguration {
query(query), query(query),
deleter(deleter), deleter(deleter),
enumerator(enumerator), enumerator(enumerator),
definer(0),
data(data),
flags(flags) {}
IndexedPropertyHandlerConfiguration(
IndexedPropertyGetterCallback getter,
IndexedPropertySetterCallback setter, IndexedPropertyQueryCallback query,
IndexedPropertyDeleterCallback deleter,
IndexedPropertyEnumeratorCallback enumerator,
IndexedPropertyDefinerCallback definer,
Local<Value> data = Local<Value>(),
PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
: getter(getter),
setter(setter),
query(query),
deleter(deleter),
enumerator(enumerator),
definer(definer),
data(data), data(data),
flags(flags) {} flags(flags) {}
...@@ -5031,6 +5095,7 @@ struct IndexedPropertyHandlerConfiguration { ...@@ -5031,6 +5095,7 @@ struct IndexedPropertyHandlerConfiguration {
IndexedPropertyQueryCallback query; IndexedPropertyQueryCallback query;
IndexedPropertyDeleterCallback deleter; IndexedPropertyDeleterCallback deleter;
IndexedPropertyEnumeratorCallback enumerator; IndexedPropertyEnumeratorCallback enumerator;
IndexedPropertyDefinerCallback definer;
Local<Value> data; Local<Value> data;
PropertyHandlerFlags flags; PropertyHandlerFlags flags;
}; };
......
...@@ -80,6 +80,24 @@ Handle<Object> PropertyCallbackArguments::Call( ...@@ -80,6 +80,24 @@ Handle<Object> PropertyCallbackArguments::Call(
return GetReturnValue<Object>(isolate); return GetReturnValue<Object>(isolate);
} }
Handle<Object> PropertyCallbackArguments::Call(
GenericNamedPropertyDefinerCallback f, Handle<Name> name,
const v8::PropertyDescriptor& desc) {
Isolate* isolate = this->isolate();
RuntimeCallTimerScope timer(
isolate, &RuntimeCallStats::GenericNamedPropertyDefinerCallback);
TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED(
isolate,
&tracing::TraceEventStatsTable::GenericNamedPropertyDefinerCallback);
VMState<EXTERNAL> state(isolate);
ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));
PropertyCallbackInfo<v8::Value> info(begin());
LOG(isolate,
ApiNamedPropertyAccess("interceptor-named-define", holder(), *name));
f(v8::Utils::ToLocal(name), desc, info);
return GetReturnValue<Object>(isolate);
}
Handle<Object> PropertyCallbackArguments::Call(IndexedPropertySetterCallback f, Handle<Object> PropertyCallbackArguments::Call(IndexedPropertySetterCallback f,
uint32_t index, uint32_t index,
Handle<Object> value) { Handle<Object> value) {
...@@ -97,6 +115,23 @@ Handle<Object> PropertyCallbackArguments::Call(IndexedPropertySetterCallback f, ...@@ -97,6 +115,23 @@ Handle<Object> PropertyCallbackArguments::Call(IndexedPropertySetterCallback f,
return GetReturnValue<Object>(isolate); return GetReturnValue<Object>(isolate);
} }
Handle<Object> PropertyCallbackArguments::Call(
IndexedPropertyDefinerCallback f, uint32_t index,
const v8::PropertyDescriptor& desc) {
Isolate* isolate = this->isolate();
RuntimeCallTimerScope timer(
isolate, &RuntimeCallStats::IndexedPropertyDefinerCallback);
TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED(
isolate, &tracing::TraceEventStatsTable::IndexedPropertyDefinerCallback);
VMState<EXTERNAL> state(isolate);
ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));
PropertyCallbackInfo<v8::Value> info(begin());
LOG(isolate,
ApiIndexedPropertyAccess("interceptor-indexed-define", holder(), index));
f(index, desc, info);
return GetReturnValue<Object>(isolate);
}
void PropertyCallbackArguments::Call(AccessorNameSetterCallback f, void PropertyCallbackArguments::Call(AccessorNameSetterCallback f,
Handle<Name> name, Handle<Object> value) { Handle<Name> name, Handle<Object> value) {
Isolate* isolate = this->isolate(); Isolate* isolate = this->isolate();
......
...@@ -119,9 +119,16 @@ class PropertyCallbackArguments ...@@ -119,9 +119,16 @@ class PropertyCallbackArguments
inline Handle<Object> Call(GenericNamedPropertySetterCallback f, inline Handle<Object> Call(GenericNamedPropertySetterCallback f,
Handle<Name> name, Handle<Object> value); Handle<Name> name, Handle<Object> value);
inline Handle<Object> Call(GenericNamedPropertyDefinerCallback f,
Handle<Name> name,
const v8::PropertyDescriptor& desc);
inline Handle<Object> Call(IndexedPropertySetterCallback f, uint32_t index, inline Handle<Object> Call(IndexedPropertySetterCallback f, uint32_t index,
Handle<Object> value); Handle<Object> value);
inline Handle<Object> Call(IndexedPropertyDefinerCallback f, uint32_t index,
const v8::PropertyDescriptor& desc);
inline void Call(AccessorNameSetterCallback f, Handle<Name> name, inline void Call(AccessorNameSetterCallback f, Handle<Name> name,
Handle<Object> value); Handle<Object> value);
......
...@@ -1506,10 +1506,10 @@ void ObjectTemplate::SetAccessor(v8::Local<Name> name, ...@@ -1506,10 +1506,10 @@ void ObjectTemplate::SetAccessor(v8::Local<Name> name,
} }
template <typename Getter, typename Setter, typename Query, typename Deleter, template <typename Getter, typename Setter, typename Query, typename Deleter,
typename Enumerator> typename Enumerator, typename Definer>
static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
i::Isolate* isolate, Getter getter, Setter setter, Query query, i::Isolate* isolate, Getter getter, Setter setter, Query query,
Deleter remover, Enumerator enumerator, Local<Value> data, Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
PropertyHandlerFlags flags) { PropertyHandlerFlags flags) {
auto obj = i::Handle<i::InterceptorInfo>::cast( auto obj = i::Handle<i::InterceptorInfo>::cast(
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
...@@ -1520,6 +1520,7 @@ static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( ...@@ -1520,6 +1520,7 @@ static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query);
if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover);
if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator);
if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer);
obj->set_can_intercept_symbols( obj->set_can_intercept_symbols(
!(static_cast<int>(flags) & !(static_cast<int>(flags) &
static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings)));
...@@ -1536,39 +1537,35 @@ static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( ...@@ -1536,39 +1537,35 @@ static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
} }
template <typename Getter, typename Setter, typename Query, typename Deleter, template <typename Getter, typename Setter, typename Query, typename Deleter,
typename Enumerator> typename Enumerator, typename Definer>
static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ, static void ObjectTemplateSetNamedPropertyHandler(
Getter getter, Setter setter, ObjectTemplate* templ, Getter getter, Setter setter, Query query,
Query query, Deleter remover, Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
Enumerator enumerator, PropertyHandlerFlags flags) {
Local<Value> data,
PropertyHandlerFlags flags) {
i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
ENTER_V8(isolate); ENTER_V8(isolate);
i::HandleScope scope(isolate); i::HandleScope scope(isolate);
auto cons = EnsureConstructor(isolate, templ); auto cons = EnsureConstructor(isolate, templ);
EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover,
enumerator, data, flags); enumerator, definer, data, flags);
cons->set_named_property_handler(*obj); cons->set_named_property_handler(*obj);
} }
void ObjectTemplate::SetNamedPropertyHandler( void ObjectTemplate::SetNamedPropertyHandler(
NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter,
NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover,
NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { NamedPropertyEnumeratorCallback enumerator, Local<Value> data) {
ObjectTemplateSetNamedPropertyHandler( ObjectTemplateSetNamedPropertyHandler(
this, getter, setter, query, remover, enumerator, data, this, getter, setter, query, remover, enumerator, nullptr, data,
PropertyHandlerFlags::kOnlyInterceptStrings); PropertyHandlerFlags::kOnlyInterceptStrings);
} }
void ObjectTemplate::SetHandler( void ObjectTemplate::SetHandler(
const NamedPropertyHandlerConfiguration& config) { const NamedPropertyHandlerConfiguration& config) {
ObjectTemplateSetNamedPropertyHandler( ObjectTemplateSetNamedPropertyHandler(
this, config.getter, config.setter, config.query, config.deleter, this, config.getter, config.setter, config.query, config.deleter,
config.enumerator, config.data, config.flags); config.enumerator, config.definer, config.data, config.flags);
} }
...@@ -1628,13 +1625,14 @@ void ObjectTemplate::SetAccessCheckCallbackAndHandler( ...@@ -1628,13 +1625,14 @@ void ObjectTemplate::SetAccessCheckCallbackAndHandler(
SET_FIELD_WRAPPED(info, set_callback, callback); SET_FIELD_WRAPPED(info, set_callback, callback);
auto named_interceptor = CreateInterceptorInfo( auto named_interceptor = CreateInterceptorInfo(
isolate, named_handler.getter, named_handler.setter, named_handler.query, isolate, named_handler.getter, named_handler.setter, named_handler.query,
named_handler.deleter, named_handler.enumerator, named_handler.data, named_handler.deleter, named_handler.enumerator, named_handler.definer,
named_handler.flags); named_handler.data, named_handler.flags);
info->set_named_interceptor(*named_interceptor); info->set_named_interceptor(*named_interceptor);
auto indexed_interceptor = CreateInterceptorInfo( auto indexed_interceptor = CreateInterceptorInfo(
isolate, indexed_handler.getter, indexed_handler.setter, isolate, indexed_handler.getter, indexed_handler.setter,
indexed_handler.query, indexed_handler.deleter, indexed_handler.query, indexed_handler.deleter,
indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags); indexed_handler.enumerator, indexed_handler.definer, indexed_handler.data,
indexed_handler.flags);
info->set_indexed_interceptor(*indexed_interceptor); info->set_indexed_interceptor(*indexed_interceptor);
if (data.IsEmpty()) { if (data.IsEmpty()) {
...@@ -1655,7 +1653,7 @@ void ObjectTemplate::SetHandler( ...@@ -1655,7 +1653,7 @@ void ObjectTemplate::SetHandler(
EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
auto obj = CreateInterceptorInfo( auto obj = CreateInterceptorInfo(
isolate, config.getter, config.setter, config.query, config.deleter, isolate, config.getter, config.setter, config.query, config.deleter,
config.enumerator, config.data, config.flags); config.enumerator, config.definer, config.data, config.flags);
cons->set_indexed_property_handler(*obj); cons->set_indexed_property_handler(*obj);
} }
......
...@@ -677,9 +677,11 @@ class RuntimeCallTimer { ...@@ -677,9 +677,11 @@ class RuntimeCallTimer {
V(DeoptimizeCode) \ V(DeoptimizeCode) \
V(FunctionCallback) \ V(FunctionCallback) \
V(GC) \ V(GC) \
V(GenericNamedPropertyDefinerCallback) \
V(GenericNamedPropertyDeleterCallback) \ V(GenericNamedPropertyDeleterCallback) \
V(GenericNamedPropertyQueryCallback) \ V(GenericNamedPropertyQueryCallback) \
V(GenericNamedPropertySetterCallback) \ V(GenericNamedPropertySetterCallback) \
V(IndexedPropertyDefinerCallback) \
V(IndexedPropertyDeleterCallback) \ V(IndexedPropertyDeleterCallback) \
V(IndexedPropertyGetterCallback) \ V(IndexedPropertyGetterCallback) \
V(IndexedPropertyQueryCallback) \ V(IndexedPropertyQueryCallback) \
......
...@@ -5709,6 +5709,7 @@ ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset) ...@@ -5709,6 +5709,7 @@ ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
ACCESSORS(InterceptorInfo, query, Object, kQueryOffset) ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset) ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset) ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
ACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
ACCESSORS(InterceptorInfo, data, Object, kDataOffset) ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset) SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols, BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
......
...@@ -1677,6 +1677,71 @@ Maybe<bool> SetPropertyWithInterceptorInternal( ...@@ -1677,6 +1677,71 @@ Maybe<bool> SetPropertyWithInterceptorInternal(
return Just(result); return Just(result);
} }
Maybe<bool> DefinePropertyWithInterceptorInternal(
LookupIterator* it, Handle<InterceptorInfo> interceptor,
Object::ShouldThrow should_throw, PropertyDescriptor& desc) {
Isolate* isolate = it->isolate();
// Make sure that the top context does not change when doing callbacks or
// interceptor calls.
AssertNoContextChange ncc(isolate);
if (interceptor->definer()->IsUndefined(isolate)) return Just(false);
Handle<JSObject> holder = it->GetHolder<JSObject>();
bool result;
Handle<Object> receiver = it->GetReceiver();
if (!receiver->IsJSReceiver()) {
ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver,
Object::ConvertReceiver(isolate, receiver),
Nothing<bool>());
}
PropertyCallbackArguments args(isolate, interceptor->data(), *receiver,
*holder, should_throw);
std::unique_ptr<v8::PropertyDescriptor> descriptor(
new v8::PropertyDescriptor());
if (PropertyDescriptor::IsAccessorDescriptor(&desc)) {
descriptor.reset(new v8::PropertyDescriptor(
v8::Utils::ToLocal(desc.get()), v8::Utils::ToLocal(desc.set())));
} else if (PropertyDescriptor::IsDataDescriptor(&desc)) {
if (desc.has_writable()) {
descriptor.reset(new v8::PropertyDescriptor(
v8::Utils::ToLocal(desc.value()), desc.writable()));
} else {
descriptor.reset(
new v8::PropertyDescriptor(v8::Utils::ToLocal(desc.value())));
}
}
if (desc.has_enumerable()) {
descriptor->set_enumerable(desc.enumerable());
}
if (desc.has_configurable()) {
descriptor->set_configurable(desc.configurable());
}
if (it->IsElement()) {
uint32_t index = it->index();
v8::IndexedPropertyDefinerCallback definer =
v8::ToCData<v8::IndexedPropertyDefinerCallback>(interceptor->definer());
result = !args.Call(definer, index, *descriptor).is_null();
} else {
Handle<Name> name = it->name();
DCHECK(!name->IsPrivate());
if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
return Just(false);
}
v8::GenericNamedPropertyDefinerCallback definer =
v8::ToCData<v8::GenericNamedPropertyDefinerCallback>(
interceptor->definer());
result = !args.Call(definer, name, *descriptor).is_null();
}
RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>());
return Just(result);
}
} // namespace } // namespace
MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
...@@ -6535,6 +6600,34 @@ Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate, ...@@ -6535,6 +6600,34 @@ Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate,
it.Next(); it.Next();
} }
// Handle interceptor
if (it.state() == LookupIterator::INTERCEPTOR) {
Handle<Map> store_target_map;
if (it.GetReceiver()->IsJSObject()) {
store_target_map = handle(it.GetStoreTarget()->map(), it.isolate());
}
if (it.HolderIsReceiverOrHiddenPrototype()) {
Maybe<bool> result = DefinePropertyWithInterceptorInternal(
&it, it.GetInterceptor(), should_throw, *desc);
if (result.IsNothing() || result.FromJust()) {
return result;
}
// Interceptor modified the store target but failed to set the
// property.
if (!store_target_map.is_null() &&
*store_target_map != it.GetStoreTarget()->map()) {
it.isolate()->PushStackTraceAndDie(
0xabababaa, v8::ToCData<void*>(it.GetInterceptor()->setter()),
nullptr, 0xabababab);
}
Utils::ApiCheck(store_target_map.is_null() ||
*store_target_map == it.GetStoreTarget()->map(),
it.IsElement() ? "v8::IndexedPropertySetterCallback"
: "v8::NamedPropertySetterCallback",
"Interceptor silently changed store target.");
}
}
return OrdinaryDefineOwnProperty(&it, desc, should_throw); return OrdinaryDefineOwnProperty(&it, desc, should_throw);
} }
......
...@@ -10791,6 +10791,7 @@ class InterceptorInfo: public Struct { ...@@ -10791,6 +10791,7 @@ class InterceptorInfo: public Struct {
DECL_ACCESSORS(query, Object) DECL_ACCESSORS(query, Object)
DECL_ACCESSORS(deleter, Object) DECL_ACCESSORS(deleter, Object)
DECL_ACCESSORS(enumerator, Object) DECL_ACCESSORS(enumerator, Object)
DECL_ACCESSORS(definer, Object)
DECL_ACCESSORS(data, Object) DECL_ACCESSORS(data, Object)
DECL_BOOLEAN_ACCESSORS(can_intercept_symbols) DECL_BOOLEAN_ACCESSORS(can_intercept_symbols)
DECL_BOOLEAN_ACCESSORS(all_can_read) DECL_BOOLEAN_ACCESSORS(all_can_read)
...@@ -10810,7 +10811,8 @@ class InterceptorInfo: public Struct { ...@@ -10810,7 +10811,8 @@ class InterceptorInfo: public Struct {
static const int kQueryOffset = kSetterOffset + kPointerSize; static const int kQueryOffset = kSetterOffset + kPointerSize;
static const int kDeleterOffset = kQueryOffset + kPointerSize; static const int kDeleterOffset = kQueryOffset + kPointerSize;
static const int kEnumeratorOffset = kDeleterOffset + kPointerSize; static const int kEnumeratorOffset = kDeleterOffset + kPointerSize;
static const int kDataOffset = kEnumeratorOffset + kPointerSize; static const int kDefinerOffset = kEnumeratorOffset + kPointerSize;
static const int kDataOffset = kDefinerOffset + kPointerSize;
static const int kFlagsOffset = kDataOffset + kPointerSize; static const int kFlagsOffset = kDataOffset + kPointerSize;
static const int kSize = kFlagsOffset + kPointerSize; static const int kSize = kFlagsOffset + kPointerSize;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment