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

Unified Diff: src/objects.cc

Issue 2807333003: [api] Add DefineProperty() method that skips interceptors.
Patch Set: Extend DefineProperty API Created 3 years, 7 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
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 2901840af92fbe0b1cd995ba1129a4cb4024befa..6e35c5e4537b397987cf4656c7def68a84912ec9 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -4483,7 +4483,7 @@ Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value,
PropertyDescriptor value_desc;
value_desc.set_value(value);
return JSReceiver::DefineOwnProperty(isolate, receiver, it->GetName(),
- &value_desc, should_throw);
+ &value_desc, should_throw, false);
}
case LookupIterator::NOT_FOUND:
@@ -6101,7 +6101,8 @@ Maybe<bool> JSReceiver::DeletePropertyOrElement(Handle<JSReceiver> object,
// static
Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object,
Handle<Object> key,
- Handle<Object> attributes) {
+ Handle<Object> attributes,
+ bool bypass_interceptor) {
// 1. If Type(O) is not Object, throw a TypeError exception.
if (!object->IsJSReceiver()) {
Handle<String> fun_name =
@@ -6119,8 +6120,9 @@ Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object,
return isolate->heap()->exception();
}
// 6. Let success be DefinePropertyOrThrow(O,key, desc).
- Maybe<bool> success = DefineOwnProperty(
- isolate, Handle<JSReceiver>::cast(object), key, &desc, THROW_ON_ERROR);
+ Maybe<bool> success =
+ DefineOwnProperty(isolate, Handle<JSReceiver>::cast(object), key, &desc,
+ THROW_ON_ERROR, bypass_interceptor);
// 7. ReturnIfAbrupt(success).
MAYBE_RETURN(success, isolate->heap()->exception());
CHECK(success.FromJust());
@@ -6128,7 +6130,6 @@ Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object,
return *object;
}
-
// ES6 19.1.2.3.1
// static
MaybeHandle<Object> JSReceiver::DefineProperties(Isolate* isolate,
@@ -6212,18 +6213,22 @@ Maybe<bool> JSReceiver::DefineOwnProperty(Isolate* isolate,
Handle<JSReceiver> object,
Handle<Object> key,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor) {
if (object->IsJSArray()) {
return JSArray::DefineOwnProperty(isolate, Handle<JSArray>::cast(object),
- key, desc, should_throw);
+ key, desc, should_throw,
+ bypass_interceptor);
}
if (object->IsJSProxy()) {
return JSProxy::DefineOwnProperty(isolate, Handle<JSProxy>::cast(object),
- key, desc, should_throw);
+ key, desc, should_throw,
+ bypass_interceptor);
}
if (object->IsJSTypedArray()) {
return JSTypedArray::DefineOwnProperty(
- isolate, Handle<JSTypedArray>::cast(object), key, desc, should_throw);
+ isolate, Handle<JSTypedArray>::cast(object), key, desc, should_throw,
+ bypass_interceptor);
}
// TODO(neis): Special case for JSModuleNamespace?
@@ -6231,20 +6236,27 @@ Maybe<bool> JSReceiver::DefineOwnProperty(Isolate* isolate,
// DefineOwnPropertyIgnoreAttributes, can handle arguments
// (ES#sec-arguments-exotic-objects-defineownproperty-p-desc).
return OrdinaryDefineOwnProperty(isolate, Handle<JSObject>::cast(object), key,
- desc, should_throw);
+ desc, should_throw, bypass_interceptor);
}
-
// static
Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate,
Handle<JSObject> object,
Handle<Object> key,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor) {
bool success = false;
DCHECK(key->IsName() || key->IsNumber()); // |key| is a PropertyKey...
- LookupIterator it = LookupIterator::PropertyOrElement(
- isolate, object, key, &success, LookupIterator::OWN);
+
+ LookupIterator::Configuration ItBase = LookupIterator::OWN;
Franzi 2017/05/10 09:17:52 Can we name this iterator_config or config?
+ if (bypass_interceptor) {
+ ItBase = LookupIterator::OWN_SKIP_INTERCEPTOR;
+ }
+
+ LookupIterator it =
+ LookupIterator::PropertyOrElement(isolate, object, key, &success, ItBase);
+
DCHECK(success); // ...so creating a LookupIterator can't fail.
// Deal with access checks first.
@@ -6257,13 +6269,15 @@ Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate,
it.Next();
}
Franzi 2017/05/10 09:17:52 I think if OWN_SKIP_INTERCEPTOR was used, the stat
- // Handle interceptor
- if (it.state() == LookupIterator::INTERCEPTOR) {
- if (it.HolderIsReceiverOrHiddenPrototype()) {
- Maybe<bool> result = DefinePropertyWithInterceptorInternal(
- &it, it.GetInterceptor(), should_throw, *desc);
- if (result.IsNothing() || result.FromJust()) {
- return result;
+ if (!bypass_interceptor) {
+ // Handle interceptor
+ if (it.state() == LookupIterator::INTERCEPTOR) {
+ if (it.HolderIsReceiverOrHiddenPrototype()) {
+ Maybe<bool> result = DefinePropertyWithInterceptorInternal(
+ &it, it.GetInterceptor(), should_throw, *desc);
+ if (result.IsNothing() || result.FromJust()) {
+ return result;
+ }
}
}
}
@@ -6587,7 +6601,7 @@ Maybe<bool> JSReceiver::CreateDataProperty(LookupIterator* it,
new_desc.set_configurable(true);
return JSReceiver::DefineOwnProperty(isolate, receiver, it->GetName(),
- &new_desc, should_throw);
+ &new_desc, should_throw, false);
Franzi 2017/05/10 09:17:52 Do we need the last parameter? I thought it has a
}
Maybe<bool> JSObject::CreateDataProperty(LookupIterator* it,
@@ -6641,13 +6655,14 @@ bool PropertyKeyToArrayIndex(Handle<Object> index_obj, uint32_t* output) {
Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o,
Handle<Object> name,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor) {
// 1. Assert: IsPropertyKey(P) is true. ("P" is |name|.)
// 2. If P is "length", then:
// TODO(jkummerow): Check if we need slow string comparison.
if (*name == isolate->heap()->length_string()) {
// 2a. Return ArraySetLength(A, Desc).
- return ArraySetLength(isolate, o, desc, should_throw);
+ return ArraySetLength(isolate, o, desc, should_throw, bypass_interceptor);
}
// 3. Else if P is an array index, then:
uint32_t index = 0;
@@ -6673,8 +6688,8 @@ Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o,
NewTypeError(MessageTemplate::kDefineDisallowed, name));
}
// 3g. Let succeeded be OrdinaryDefineOwnProperty(A, P, Desc).
- Maybe<bool> succeeded =
- OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw);
+ Maybe<bool> succeeded = OrdinaryDefineOwnProperty(
+ isolate, o, name, desc, should_throw, bypass_interceptor);
// 3h. Assert: succeeded is not an abrupt completion.
// In our case, if should_throw == THROW_ON_ERROR, it can be!
// 3i. If succeeded is false, return false.
@@ -6685,9 +6700,9 @@ Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o,
old_len_desc.set_value(isolate->factory()->NewNumberFromUint(index + 1));
// 3j ii. Let succeeded be
// OrdinaryDefineOwnProperty(A, "length", oldLenDesc).
- succeeded = OrdinaryDefineOwnProperty(isolate, o,
- isolate->factory()->length_string(),
- &old_len_desc, should_throw);
+ succeeded = OrdinaryDefineOwnProperty(
+ isolate, o, isolate->factory()->length_string(), &old_len_desc,
+ should_throw, bypass_interceptor);
// 3j iii. Assert: succeeded is true.
DCHECK(succeeded.FromJust());
USE(succeeded);
@@ -6697,7 +6712,8 @@ Maybe<bool> JSArray::DefineOwnProperty(Isolate* isolate, Handle<JSArray> o,
}
// 4. Return OrdinaryDefineOwnProperty(A, P, Desc).
- return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw);
+ return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw,
+ bypass_interceptor);
}
@@ -6742,12 +6758,14 @@ bool JSArray::AnythingToArrayLength(Isolate* isolate,
// static
Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor = false) {
// 1. If the [[Value]] field of Desc is absent, then
if (!desc->has_value()) {
// 1a. Return OrdinaryDefineOwnProperty(A, "length", Desc).
- return OrdinaryDefineOwnProperty(
- isolate, a, isolate->factory()->length_string(), desc, should_throw);
+ return OrdinaryDefineOwnProperty(isolate, a,
+ isolate->factory()->length_string(), desc,
+ should_throw, bypass_interceptor);
}
// 2. Let newLenDesc be a copy of Desc.
// (Actual copying is not necessary.)
@@ -6775,9 +6793,9 @@ Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
// 8. Set newLenDesc.[[Value]] to newLen.
// 12a. Return OrdinaryDefineOwnProperty(A, "length", newLenDesc).
new_len_desc->set_value(isolate->factory()->NewNumberFromUint(new_len));
- return OrdinaryDefineOwnProperty(isolate, a,
- isolate->factory()->length_string(),
- new_len_desc, should_throw);
+ return OrdinaryDefineOwnProperty(
+ isolate, a, isolate->factory()->length_string(), new_len_desc,
+ should_throw, bypass_interceptor);
}
// 13. If oldLenDesc.[[Writable]] is false, return false.
if (!old_len_desc.writable()) {
@@ -6806,7 +6824,7 @@ Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
readonly.set_writable(false);
Maybe<bool> success = OrdinaryDefineOwnProperty(
isolate, a, isolate->factory()->length_string(), &readonly,
- should_throw);
+ should_throw, bypass_interceptor);
DCHECK(success.FromJust());
USE(success);
}
@@ -6830,7 +6848,8 @@ Maybe<bool> JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
Maybe<bool> JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy,
Handle<Object> key,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor) {
STACK_CHECK(isolate, Nothing<bool>());
if (key->IsSymbol() && Handle<Symbol>::cast(key)->IsPrivate()) {
return SetPrivateProperty(isolate, proxy, Handle<Symbol>::cast(key), desc,
@@ -6860,7 +6879,7 @@ Maybe<bool> JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy,
if (trap->IsUndefined(isolate)) {
// 7a. Return target.[[DefineOwnProperty]](P, Desc).
return JSReceiver::DefineOwnProperty(isolate, target, key, desc,
- should_throw);
+ should_throw, bypass_interceptor);
}
// 8. Let descObj be FromPropertyDescriptor(Desc).
Handle<Object> desc_obj = desc->ToObject(isolate);
@@ -7403,9 +7422,9 @@ Maybe<bool> JSReceiver::SetIntegrityLevel(Handle<JSReceiver> receiver,
if (level == SEALED) {
for (int i = 0; i < keys->length(); ++i) {
Handle<Object> key(keys->get(i), isolate);
- MAYBE_RETURN(
- DefineOwnProperty(isolate, receiver, key, &no_conf, THROW_ON_ERROR),
- Nothing<bool>());
+ MAYBE_RETURN(DefineOwnProperty(isolate, receiver, key, &no_conf,
+ THROW_ON_ERROR, false),
+ Nothing<bool>());
}
return Just(true);
}
@@ -7421,9 +7440,9 @@ Maybe<bool> JSReceiver::SetIntegrityLevel(Handle<JSReceiver> receiver,
PropertyDescriptor::IsAccessorDescriptor(&current_desc)
? no_conf
: no_conf_no_write;
- MAYBE_RETURN(
- DefineOwnProperty(isolate, receiver, key, &desc, THROW_ON_ERROR),
- Nothing<bool>());
+ MAYBE_RETURN(DefineOwnProperty(isolate, receiver, key, &desc,
+ THROW_ON_ERROR, false),
+ Nothing<bool>());
}
}
return Just(true);
@@ -17163,7 +17182,8 @@ Maybe<bool> JSTypedArray::DefineOwnProperty(Isolate* isolate,
Handle<JSTypedArray> o,
Handle<Object> key,
PropertyDescriptor* desc,
- ShouldThrow should_throw) {
+ ShouldThrow should_throw,
+ bool bypass_interceptor) {
// 1. Assert: IsPropertyKey(P) is true.
DCHECK(key->IsName() || key->IsNumber());
// 2. Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
@@ -17224,7 +17244,8 @@ Maybe<bool> JSTypedArray::DefineOwnProperty(Isolate* isolate,
}
}
// 4. Return ! OrdinaryDefineOwnProperty(O, P, Desc).
- return OrdinaryDefineOwnProperty(isolate, o, key, desc, should_throw);
+ return OrdinaryDefineOwnProperty(isolate, o, key, desc, should_throw,
+ bypass_interceptor);
}
ExternalArrayType JSTypedArray::type() {

Powered by Google App Engine
This is Rietveld 408576698