OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 1659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1670 v8::GenericNamedPropertySetterCallback setter = | 1670 v8::GenericNamedPropertySetterCallback setter = |
1671 v8::ToCData<v8::GenericNamedPropertySetterCallback>( | 1671 v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
1672 interceptor->setter()); | 1672 interceptor->setter()); |
1673 result = !args.Call(setter, name, value).is_null(); | 1673 result = !args.Call(setter, name, value).is_null(); |
1674 } | 1674 } |
1675 | 1675 |
1676 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>()); | 1676 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>()); |
1677 return Just(result); | 1677 return Just(result); |
1678 } | 1678 } |
1679 | 1679 |
1680 Maybe<bool> DefinePropertyWithInterceptorInternal( | |
1681 LookupIterator* it, Handle<InterceptorInfo> interceptor, | |
1682 Object::ShouldThrow should_throw, PropertyDescriptor& desc) { | |
1683 Isolate* isolate = it->isolate(); | |
1684 // Make sure that the top context does not change when doing callbacks or | |
1685 // interceptor calls. | |
1686 AssertNoContextChange ncc(isolate); | |
1687 | |
1688 if (interceptor->definer()->IsUndefined(isolate)) return Just(false); | |
1689 | |
1690 Handle<JSObject> holder = it->GetHolder<JSObject>(); | |
1691 bool result; | |
1692 Handle<Object> receiver = it->GetReceiver(); | |
1693 if (!receiver->IsJSReceiver()) { | |
1694 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver, | |
1695 Object::ConvertReceiver(isolate, receiver), | |
1696 Nothing<bool>()); | |
1697 } | |
1698 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, | |
1699 *holder, should_throw); | |
1700 | |
1701 std::unique_ptr<v8::PropertyDescriptor> descriptor( | |
1702 new v8::PropertyDescriptor()); | |
1703 if (PropertyDescriptor::IsAccessorDescriptor(&desc)) { | |
1704 descriptor.reset(new v8::PropertyDescriptor( | |
1705 v8::Utils::ToLocal(desc.get()), v8::Utils::ToLocal(desc.set()))); | |
1706 } else if (PropertyDescriptor::IsDataDescriptor(&desc)) { | |
1707 if (desc.has_writable()) { | |
1708 descriptor.reset(new v8::PropertyDescriptor( | |
1709 v8::Utils::ToLocal(desc.value()), desc.writable())); | |
1710 } else { | |
1711 descriptor.reset( | |
1712 new v8::PropertyDescriptor(v8::Utils::ToLocal(desc.value()))); | |
1713 } | |
1714 } | |
1715 if (desc.has_enumerable()) { | |
1716 descriptor->set_enumerable(desc.enumerable()); | |
1717 } | |
1718 if (desc.has_configurable()) { | |
1719 descriptor->set_configurable(desc.configurable()); | |
1720 } | |
1721 | |
1722 if (it->IsElement()) { | |
1723 uint32_t index = it->index(); | |
1724 v8::IndexedPropertyDefinerCallback definer = | |
1725 v8::ToCData<v8::IndexedPropertyDefinerCallback>(interceptor->definer()); | |
1726 result = !args.Call(definer, index, *descriptor).is_null(); | |
1727 } else { | |
1728 Handle<Name> name = it->name(); | |
1729 DCHECK(!name->IsPrivate()); | |
1730 | |
1731 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | |
1732 return Just(false); | |
1733 } | |
1734 | |
1735 v8::GenericNamedPropertyDefinerCallback definer = | |
1736 v8::ToCData<v8::GenericNamedPropertyDefinerCallback>( | |
1737 interceptor->definer()); | |
1738 result = !args.Call(definer, name, *descriptor).is_null(); | |
1739 } | |
1740 | |
1741 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>()); | |
1742 return Just(result); | |
1743 } | |
1744 | |
1745 } // namespace | 1680 } // namespace |
1746 | 1681 |
1747 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( | 1682 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( |
1748 LookupIterator* it) { | 1683 LookupIterator* it) { |
1749 Isolate* isolate = it->isolate(); | 1684 Isolate* isolate = it->isolate(); |
1750 Handle<JSObject> checked = it->GetHolder<JSObject>(); | 1685 Handle<JSObject> checked = it->GetHolder<JSObject>(); |
1751 Handle<InterceptorInfo> interceptor = | 1686 Handle<InterceptorInfo> interceptor = |
1752 it->GetInterceptorForFailedAccessCheck(); | 1687 it->GetInterceptorForFailedAccessCheck(); |
1753 if (interceptor.is_null()) { | 1688 if (interceptor.is_null()) { |
1754 while (AllCanRead(it)) { | 1689 while (AllCanRead(it)) { |
(...skipping 4837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6592 | 6527 |
6593 // Deal with access checks first. | 6528 // Deal with access checks first. |
6594 if (it.state() == LookupIterator::ACCESS_CHECK) { | 6529 if (it.state() == LookupIterator::ACCESS_CHECK) { |
6595 if (!it.HasAccess()) { | 6530 if (!it.HasAccess()) { |
6596 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | 6531 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); |
6597 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 6532 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
6598 return Just(true); | 6533 return Just(true); |
6599 } | 6534 } |
6600 it.Next(); | 6535 it.Next(); |
6601 } | 6536 } |
6602 | |
6603 // Handle interceptor | |
6604 if (it.state() == LookupIterator::INTERCEPTOR) { | |
6605 Handle<Map> store_target_map; | |
6606 if (it.GetReceiver()->IsJSObject()) { | |
6607 store_target_map = handle(it.GetStoreTarget()->map(), it.isolate()); | |
6608 } | |
6609 if (it.HolderIsReceiverOrHiddenPrototype()) { | |
6610 Maybe<bool> result = DefinePropertyWithInterceptorInternal( | |
6611 &it, it.GetInterceptor(), should_throw, *desc); | |
6612 if (result.IsNothing() || result.FromJust()) { | |
6613 return result; | |
6614 } | |
6615 // Interceptor modified the store target but failed to set the | |
6616 // property. | |
6617 if (!store_target_map.is_null() && | |
6618 *store_target_map != it.GetStoreTarget()->map()) { | |
6619 it.isolate()->PushStackTraceAndDie( | |
6620 0xabababaa, v8::ToCData<void*>(it.GetInterceptor()->setter()), | |
6621 nullptr, 0xabababab); | |
6622 } | |
6623 Utils::ApiCheck(store_target_map.is_null() || | |
6624 *store_target_map == it.GetStoreTarget()->map(), | |
6625 it.IsElement() ? "v8::IndexedPropertySetterCallback" | |
6626 : "v8::NamedPropertySetterCallback", | |
6627 "Interceptor silently changed store target."); | |
6628 } | |
6629 it.Next(); | |
6630 } | |
6631 | 6537 |
6632 return OrdinaryDefineOwnProperty(&it, desc, should_throw); | 6538 return OrdinaryDefineOwnProperty(&it, desc, should_throw); |
6633 } | 6539 } |
6634 | 6540 |
6635 | 6541 |
6636 // ES6 9.1.6.1 | 6542 // ES6 9.1.6.1 |
6637 // static | 6543 // static |
6638 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it, | 6544 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it, |
6639 PropertyDescriptor* desc, | 6545 PropertyDescriptor* desc, |
6640 ShouldThrow should_throw) { | 6546 ShouldThrow should_throw) { |
(...skipping 12791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19432 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, | 19338 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, |
19433 PrototypeIterator::END_AT_NULL); | 19339 PrototypeIterator::END_AT_NULL); |
19434 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { | 19340 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { |
19435 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; | 19341 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; |
19436 } | 19342 } |
19437 return false; | 19343 return false; |
19438 } | 19344 } |
19439 | 19345 |
19440 } // namespace internal | 19346 } // namespace internal |
19441 } // namespace v8 | 19347 } // namespace v8 |
OLD | NEW |