| 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 |