| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 335ffd27ee996154af93db1a629e9e2005772d73..2bfff3aa8ce5fac073cde1847911db8add4deea1 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -4786,7 +4786,8 @@ Maybe<PropertyAttributes> JSProxy::GetPropertyAttributes(LookupIterator* it) {
|
| Isolate* isolate = it->isolate();
|
| HandleScope scope(isolate);
|
| PropertyDescriptor desc;
|
| - bool found = JSProxy::GetOwnPropertyDescriptor(it, &desc);
|
| + bool found = JSProxy::GetOwnPropertyDescriptor(
|
| + isolate, it->GetHolder<JSProxy>(), it->GetName(), &desc);
|
| if (isolate->has_pending_exception()) return Nothing<PropertyAttributes>();
|
| if (!found) return Just(ABSENT);
|
| return Just(desc.ToAttributes());
|
| @@ -6900,12 +6901,13 @@ bool JSReceiver::GetOwnPropertyDescriptor(Isolate* isolate,
|
| // static
|
| bool JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it,
|
| PropertyDescriptor* desc) {
|
| + Isolate* isolate = it->isolate();
|
| // "Virtual" dispatch.
|
| if (it->IsFound() && it->GetHolder<JSReceiver>()->IsJSProxy()) {
|
| - return JSProxy::GetOwnPropertyDescriptor(it, desc);
|
| + return JSProxy::GetOwnPropertyDescriptor(isolate, it->GetHolder<JSProxy>(),
|
| + it->GetName(), desc);
|
| }
|
|
|
| - Isolate* isolate = it->isolate();
|
| // 1. (Assert)
|
| // 2. If O does not have an own property with key P, return undefined.
|
| Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(it);
|
| @@ -6954,13 +6956,11 @@ bool JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it,
|
|
|
| // ES6 9.5.5
|
| // static
|
| -bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| +bool JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, Handle<JSProxy> proxy,
|
| + Handle<Name> name,
|
| PropertyDescriptor* desc) {
|
| - Handle<JSProxy> proxy = it->GetHolder<JSProxy>();
|
| - Isolate* isolate = it->isolate();
|
| Handle<String> trap_name =
|
| isolate->factory()->getOwnPropertyDescriptor_string();
|
| - Handle<Name> property_name = it->GetName();
|
| // 1. (Assert)
|
| // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
|
| Handle<Object> handler(proxy->handler(), isolate);
|
| @@ -6973,10 +6973,9 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| // 4. Assert: Type(handler) is Object.
|
| DCHECK(handler->IsJSReceiver());
|
| // If the handler is not null, the target can't be null either.
|
| - DCHECK(it->GetHolder<JSProxy>()->target()->IsJSReceiver());
|
| + DCHECK(proxy->target()->IsJSReceiver());
|
| // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
|
| - Handle<JSReceiver> target(
|
| - JSReceiver::cast(it->GetHolder<JSProxy>()->target()), isolate);
|
| + Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
|
| // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor").
|
| Handle<Object> trap;
|
| ASSIGN_RETURN_ON_EXCEPTION_VALUE(
|
| @@ -6985,12 +6984,11 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| // 7. If trap is undefined, then
|
| if (trap->IsUndefined()) {
|
| // 7a. Return target.[[GetOwnProperty]](P).
|
| - return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name,
|
| - desc);
|
| + return JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, desc);
|
| }
|
| // 8. Let trapResultObj be ? Call(trap, handler, «target, P»).
|
| Handle<Object> trap_result_obj;
|
| - Handle<Object> args[] = {target, property_name};
|
| + Handle<Object> args[] = {target, name};
|
| ASSIGN_RETURN_ON_EXCEPTION_VALUE(
|
| isolate, trap_result_obj,
|
| Execution::Call(isolate, trap, handler, arraysize(args), args), false);
|
| @@ -6999,13 +6997,12 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) {
|
| isolate->Throw(*isolate->factory()->NewTypeError(
|
| MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj,
|
| - property_name));
|
| + name));
|
| return false;
|
| }
|
| // 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
|
| PropertyDescriptor target_desc;
|
| - JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name,
|
| - &target_desc);
|
| + JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc);
|
| if (isolate->has_pending_exception()) return false;
|
| // 11. If trapResultObj is undefined, then
|
| if (trap_result_obj->IsUndefined()) {
|
| @@ -7015,7 +7012,7 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| // exception.
|
| if (!target_desc.configurable()) {
|
| isolate->Throw(*isolate->factory()->NewTypeError(
|
| - MessageTemplate::kProxyTargetPropNotConfigurable, property_name));
|
| + MessageTemplate::kProxyTargetPropNotConfigurable, name));
|
| return false;
|
| }
|
| // 11c. Let extensibleTarget be ? IsExtensible(target).
|
| @@ -7047,7 +7044,7 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| // 15. Let valid be IsCompatiblePropertyDescriptor (extensibleTarget,
|
| // resultDesc, targetDesc).
|
| bool valid = IsCompatiblePropertyDescriptor(isolate, extensible_target, desc,
|
| - &target_desc, property_name);
|
| + &target_desc, name);
|
| // 16. If valid is false, throw a TypeError exception.
|
| if (!valid) {
|
| DCHECK(isolate->has_pending_exception());
|
| @@ -7059,7 +7056,7 @@ bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it,
|
| if (target_desc.is_empty() || target_desc.configurable()) {
|
| // 17a i. Throw a TypeError exception.
|
| isolate->Throw(*isolate->factory()->NewTypeError(
|
| - MessageTemplate::kRedefineDisallowed, property_name));
|
| + MessageTemplate::kRedefineDisallowed, name));
|
| return false;
|
| }
|
| }
|
| @@ -8295,7 +8292,6 @@ static MaybeHandle<FixedArray> CreateListFromArrayLike_StringSymbol(
|
|
|
| // ES6 9.5.12
|
| // Returns "false" in case of exception.
|
| -// TODO(jkummerow): |filter| and |enum_policy| are currently ignored.
|
| // static
|
| bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
|
| Handle<JSProxy> proxy, KeyFilter filter,
|
| @@ -8382,8 +8378,8 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
|
| // then:
|
| if (extensible_target && nonconfigurable_keys_length == 0) {
|
| // 15a. Return trapResult.
|
| - accumulator->AddKeysFromProxy(trap_result);
|
| - return true;
|
| + return accumulator->AddKeysFromProxy(proxy, trap_result, filter,
|
| + enum_policy);
|
| }
|
| // 16. Let uncheckedResultKeys be a new List which is a copy of trapResult.
|
| Zone set_zone;
|
| @@ -8412,8 +8408,8 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
|
| }
|
| // 18. If extensibleTarget is true, return trapResult.
|
| if (extensible_target) {
|
| - accumulator->AddKeysFromProxy(trap_result);
|
| - return true;
|
| + return accumulator->AddKeysFromProxy(proxy, trap_result, filter,
|
| + enum_policy);
|
| }
|
| // 19. Repeat, for each key that is an element of targetConfigurableKeys:
|
| for (int i = 0; i < target_configurable_keys->length(); ++i) {
|
| @@ -8439,8 +8435,7 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
|
| return false;
|
| }
|
| // 21. Return trapResult.
|
| - accumulator->AddKeysFromProxy(trap_result);
|
| - return true;
|
| + return accumulator->AddKeysFromProxy(proxy, trap_result, filter, enum_policy);
|
| }
|
|
|
|
|
|
|