OLD | NEW |
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 | 10 |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 647 |
648 // static | 648 // static |
649 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) { | 649 Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) { |
650 for (; it->IsFound(); it->Next()) { | 650 for (; it->IsFound(); it->Next()) { |
651 switch (it->state()) { | 651 switch (it->state()) { |
652 case LookupIterator::NOT_FOUND: | 652 case LookupIterator::NOT_FOUND: |
653 case LookupIterator::TRANSITION: | 653 case LookupIterator::TRANSITION: |
654 UNREACHABLE(); | 654 UNREACHABLE(); |
655 case LookupIterator::JSPROXY: | 655 case LookupIterator::JSPROXY: |
656 // Call the "has" trap on proxies. | 656 // Call the "has" trap on proxies. |
657 return JSProxy::HasPropertyWithHandler(it->GetHolder<JSProxy>(), | 657 return JSProxy::HasProperty(it->isolate(), it->GetHolder<JSProxy>(), |
658 it->GetName()); | 658 it->GetName()); |
659 case LookupIterator::INTERCEPTOR: { | 659 case LookupIterator::INTERCEPTOR: { |
660 Maybe<PropertyAttributes> result = | 660 Maybe<PropertyAttributes> result = |
661 JSObject::GetPropertyAttributesWithInterceptor(it); | 661 JSObject::GetPropertyAttributesWithInterceptor(it); |
662 if (!result.IsJust()) return Nothing<bool>(); | 662 if (!result.IsJust()) return Nothing<bool>(); |
663 if (result.FromJust() != ABSENT) return Just(true); | 663 if (result.FromJust() != ABSENT) return Just(true); |
664 break; | 664 break; |
665 } | 665 } |
666 case LookupIterator::ACCESS_CHECK: { | 666 case LookupIterator::ACCESS_CHECK: { |
667 if (it->HasAccess()) break; | 667 if (it->HasAccess()) break; |
668 Maybe<PropertyAttributes> result = | 668 Maybe<PropertyAttributes> result = |
(...skipping 3847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4516 } | 4516 } |
4517 | 4517 |
4518 | 4518 |
4519 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, | 4519 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, |
4520 ElementsKind to_kind) { | 4520 ElementsKind to_kind) { |
4521 Handle<Map> map(object->map()); | 4521 Handle<Map> map(object->map()); |
4522 return Map::TransitionElementsTo(map, to_kind); | 4522 return Map::TransitionElementsTo(map, to_kind); |
4523 } | 4523 } |
4524 | 4524 |
4525 | 4525 |
4526 Maybe<bool> JSProxy::HasPropertyWithHandler(Handle<JSProxy> proxy, | 4526 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, |
4527 Handle<Name> name) { | 4527 Handle<Name> name) { |
4528 Isolate* isolate = proxy->GetIsolate(); | 4528 // 1. (Assert) |
4529 | 4529 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
4530 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 4530 Handle<Object> handler(proxy->handler(), isolate); |
4531 if (name->IsSymbol()) return Just(false); | 4531 // 3. If handler is null, throw a TypeError exception. |
4532 | 4532 if (JSProxy::IsRevoked(proxy)) { |
4533 Handle<Object> args[] = { name }; | 4533 isolate->Throw(*isolate->factory()->NewTypeError( |
4534 Handle<Object> result; | 4534 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); |
| 4535 return Nothing<bool>(); |
| 4536 } |
| 4537 // 4. Assert: Type(handler) is Object. |
| 4538 DCHECK(handler->IsJSReceiver()); |
| 4539 DCHECK(proxy->target()->IsJSReceiver()); |
| 4540 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. |
| 4541 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
| 4542 // 6. Let trap be ? GetMethod(handler, "has"). |
| 4543 Handle<Object> trap; |
4535 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 4544 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
4536 isolate, result, CallTrap(proxy, "has", isolate->derived_has_trap(), | 4545 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler), |
4537 arraysize(args), args), | 4546 isolate->factory()->has_string()), |
4538 Nothing<bool>()); | 4547 Nothing<bool>()); |
4539 | 4548 // 7. If trap is undefined, then |
4540 return Just(result->BooleanValue()); | 4549 if (trap->IsUndefined()) { |
| 4550 // 7a. Return target.[[HasProperty]](P). |
| 4551 return JSReceiver::HasProperty(target, name); |
| 4552 } |
| 4553 // 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)). |
| 4554 Handle<Object> trap_result_obj; |
| 4555 Handle<Object> args[] = {target, name}; |
| 4556 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 4557 isolate, trap_result_obj, |
| 4558 Execution::Call(isolate, trap, handler, arraysize(args), args), |
| 4559 Nothing<bool>()); |
| 4560 bool boolean_trap_result = trap_result_obj->BooleanValue(); |
| 4561 // 9. If booleanTrapResult is false, then: |
| 4562 if (!boolean_trap_result) { |
| 4563 // 9a. Let targetDesc be ? target.[[GetOwnProperty]](P). |
| 4564 PropertyDescriptor target_desc; |
| 4565 bool target_found = JSReceiver::GetOwnPropertyDescriptor( |
| 4566 isolate, target, name, &target_desc); |
| 4567 // 9b. If targetDesc is not undefined, then: |
| 4568 if (target_found) { |
| 4569 // 9b i. If targetDesc.[[Configurable]] is false, throw a TypeError |
| 4570 // exception. |
| 4571 if (!target_desc.configurable()) { |
| 4572 isolate->Throw(*isolate->factory()->NewTypeError( |
| 4573 MessageTemplate::kProxyTargetPropNotConfigurable, name)); |
| 4574 return Nothing<bool>(); |
| 4575 } |
| 4576 // 9b ii. Let extensibleTarget be ? IsExtensible(target). |
| 4577 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); |
| 4578 if (maybe_extensible.IsNothing()) return maybe_extensible; |
| 4579 bool extensible_target = maybe_extensible.FromJust(); |
| 4580 // 9b iii. If extensibleTarget is false, throw a TypeError exception. |
| 4581 if (!extensible_target) { |
| 4582 isolate->Throw(*isolate->factory()->NewTypeError( |
| 4583 MessageTemplate::kProxyTargetNotExtensible)); |
| 4584 } |
| 4585 } |
| 4586 } |
| 4587 // 10. Return booleanTrapResult. |
| 4588 return Just(boolean_trap_result); |
4541 } | 4589 } |
4542 | 4590 |
4543 | 4591 |
4544 Maybe<bool> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy, | 4592 Maybe<bool> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy, |
4545 Handle<Object> receiver, | 4593 Handle<Object> receiver, |
4546 Handle<Name> name, | 4594 Handle<Name> name, |
4547 Handle<Object> value, | 4595 Handle<Object> value, |
4548 ShouldThrow should_throw) { | 4596 ShouldThrow should_throw) { |
4549 Isolate* isolate = proxy->GetIsolate(); | 4597 Isolate* isolate = proxy->GetIsolate(); |
4550 | 4598 |
(...skipping 14392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18943 if (cell->value() != *new_value) { | 18991 if (cell->value() != *new_value) { |
18944 cell->set_value(*new_value); | 18992 cell->set_value(*new_value); |
18945 Isolate* isolate = cell->GetIsolate(); | 18993 Isolate* isolate = cell->GetIsolate(); |
18946 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18994 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18947 isolate, DependentCode::kPropertyCellChangedGroup); | 18995 isolate, DependentCode::kPropertyCellChangedGroup); |
18948 } | 18996 } |
18949 } | 18997 } |
18950 | 18998 |
18951 } // namespace internal | 18999 } // namespace internal |
18952 } // namespace v8 | 19000 } // namespace v8 |
OLD | NEW |