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

Side by Side Diff: src/objects.cc

Issue 1479143002: [proxies] [[HasProperty]]: fix trap call. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 #include <unordered_set> 10 #include <unordered_set>
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 646
647 // static 647 // static
648 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) { 648 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) {
649 for (; it->IsFound(); it->Next()) { 649 for (; it->IsFound(); it->Next()) {
650 switch (it->state()) { 650 switch (it->state()) {
651 case LookupIterator::NOT_FOUND: 651 case LookupIterator::NOT_FOUND:
652 case LookupIterator::TRANSITION: 652 case LookupIterator::TRANSITION:
653 UNREACHABLE(); 653 UNREACHABLE();
654 case LookupIterator::JSPROXY: 654 case LookupIterator::JSPROXY:
655 // Call the "has" trap on proxies. 655 // Call the "has" trap on proxies.
656 return JSProxy::HasPropertyWithHandler(it->GetHolder<JSProxy>(), 656 return JSProxy::HasProperty(it->isolate(), it->GetHolder<JSProxy>(),
657 it->GetName()); 657 it->GetName());
658 case LookupIterator::INTERCEPTOR: { 658 case LookupIterator::INTERCEPTOR: {
659 Maybe<PropertyAttributes> result = 659 Maybe<PropertyAttributes> result =
660 JSObject::GetPropertyAttributesWithInterceptor(it); 660 JSObject::GetPropertyAttributesWithInterceptor(it);
661 if (!result.IsJust()) return Nothing<bool>(); 661 if (!result.IsJust()) return Nothing<bool>();
662 if (result.FromJust() != ABSENT) return Just(true); 662 if (result.FromJust() != ABSENT) return Just(true);
663 break; 663 break;
664 } 664 }
665 case LookupIterator::ACCESS_CHECK: { 665 case LookupIterator::ACCESS_CHECK: {
666 if (it->HasAccess()) break; 666 if (it->HasAccess()) break;
667 Maybe<PropertyAttributes> result = 667 Maybe<PropertyAttributes> result =
(...skipping 3844 matching lines...) Expand 10 before | Expand all | Expand 10 after
4512 } 4512 }
4513 4513
4514 4514
4515 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, 4515 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object,
4516 ElementsKind to_kind) { 4516 ElementsKind to_kind) {
4517 Handle<Map> map(object->map()); 4517 Handle<Map> map(object->map());
4518 return Map::TransitionElementsTo(map, to_kind); 4518 return Map::TransitionElementsTo(map, to_kind);
4519 } 4519 }
4520 4520
4521 4521
4522 Maybe<bool> JSProxy::HasPropertyWithHandler(Handle<JSProxy> proxy, 4522 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy,
4523 Handle<Name> name) { 4523 Handle<Name> name) {
4524 Isolate* isolate = proxy->GetIsolate(); 4524 // 1. (Assert)
4525 4525 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
4526 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 4526 Handle<Object> handler(proxy->handler(), isolate);
4527 if (name->IsSymbol()) return Just(false); 4527 // 3. If handler is null, throw a TypeError exception.
4528 4528 if (JSProxy::IsRevoked(proxy)) {
4529 Handle<Object> args[] = { name }; 4529 isolate->Throw(*isolate->factory()->NewTypeError(
4530 Handle<Object> result; 4530 MessageTemplate::kProxyRevoked, isolate->factory()->has_string()));
4531 return Nothing<bool>();
4532 }
4533 // 4. Assert: Type(handler) is Object.
4534 DCHECK(handler->IsJSReceiver());
4535 DCHECK(proxy->target()->IsJSReceiver());
4536 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
4537 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
4538 // 6. Let trap be ? GetMethod(handler, "has").
4539 Handle<Object> trap;
4531 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 4540 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
4532 isolate, result, CallTrap(proxy, "has", isolate->derived_has_trap(), 4541 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler),
4533 arraysize(args), args), 4542 isolate->factory()->has_string()),
4534 Nothing<bool>()); 4543 Nothing<bool>());
4535 4544 // 7. If trap is undefined, then
4536 return Just(result->BooleanValue()); 4545 if (trap->IsUndefined()) {
4546 // 7a. Return target.[[HasProperty]](P).
4547 return JSReceiver::HasProperty(target, name);
4548 }
4549 // 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)).
4550 Handle<Object> trap_result_obj;
4551 Handle<Object> args[] = {target, name};
4552 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
4553 isolate, trap_result_obj,
4554 Execution::Call(isolate, trap, handler, arraysize(args), args),
4555 Nothing<bool>());
4556 bool boolean_trap_result = trap_result_obj->BooleanValue();
4557 // 9. If booleanTrapResult is false, then:
4558 if (!boolean_trap_result) {
4559 // 9a. Let targetDesc be ? target.[[GetOwnProperty]](P).
4560 PropertyDescriptor target_desc;
4561 bool target_found = JSReceiver::GetOwnPropertyDescriptor(
4562 isolate, target, name, &target_desc);
4563 // 9b. If targetDesc is not undefined, then:
4564 if (target_found) {
4565 // 9b i. If targetDesc.[[Configurable]] is false, throw a TypeError
4566 // exception.
4567 if (!target_desc.configurable()) {
4568 isolate->Throw(*isolate->factory()->NewTypeError(
4569 MessageTemplate::kProxyTargetPropNotConfigurable, name));
4570 return Nothing<bool>();
4571 }
4572 // 9b ii. Let extensibleTarget be ? IsExtensible(target).
4573 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target);
4574 if (maybe_extensible.IsNothing()) return maybe_extensible;
4575 bool extensible_target = maybe_extensible.FromJust();
4576 // 9b iii. If extensibleTarget is false, throw a TypeError exception.
4577 if (!extensible_target) {
4578 isolate->Throw(*isolate->factory()->NewTypeError(
4579 MessageTemplate::kProxyTargetNotExtensible));
4580 }
4581 }
4582 }
4583 // 10. Return booleanTrapResult.
4584 return Just(boolean_trap_result);
4537 } 4585 }
4538 4586
4539 4587
4540 Maybe<bool> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy, 4588 Maybe<bool> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy,
4541 Handle<Object> receiver, 4589 Handle<Object> receiver,
4542 Handle<Name> name, 4590 Handle<Name> name,
4543 Handle<Object> value, 4591 Handle<Object> value,
4544 ShouldThrow should_throw) { 4592 ShouldThrow should_throw) {
4545 Isolate* isolate = proxy->GetIsolate(); 4593 Isolate* isolate = proxy->GetIsolate();
4546 4594
(...skipping 14321 matching lines...) Expand 10 before | Expand all | Expand 10 after
18868 if (cell->value() != *new_value) { 18916 if (cell->value() != *new_value) {
18869 cell->set_value(*new_value); 18917 cell->set_value(*new_value);
18870 Isolate* isolate = cell->GetIsolate(); 18918 Isolate* isolate = cell->GetIsolate();
18871 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18919 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18872 isolate, DependentCode::kPropertyCellChangedGroup); 18920 isolate, DependentCode::kPropertyCellChangedGroup);
18873 } 18921 }
18874 } 18922 }
18875 18923
18876 } // namespace internal 18924 } // namespace internal
18877 } // namespace v8 18925 } // namespace v8
OLDNEW
« src/js/proxy.js ('K') | « src/objects.h ('k') | test/mjsunit/harmony/proxies-enumerate.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698