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 4905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4916 // Check whether it makes sense to reuse the lookup iterator. Here it | 4916 // Check whether it makes sense to reuse the lookup iterator. Here it |
4917 // might still call into setters up the prototype chain. | 4917 // might still call into setters up the prototype chain. |
4918 return JSObject::SetPropertyWithFailedAccessCheck(it, value, | 4918 return JSObject::SetPropertyWithFailedAccessCheck(it, value, |
4919 should_throw); | 4919 should_throw); |
4920 | 4920 |
4921 case LookupIterator::JSPROXY: | 4921 case LookupIterator::JSPROXY: |
4922 return JSProxy::SetProperty(it->GetHolder<JSProxy>(), it->GetName(), | 4922 return JSProxy::SetProperty(it->GetHolder<JSProxy>(), it->GetName(), |
4923 value, it->GetReceiver(), language_mode); | 4923 value, it->GetReceiver(), language_mode); |
4924 | 4924 |
4925 case LookupIterator::INTERCEPTOR: { | 4925 case LookupIterator::INTERCEPTOR: { |
4926 Handle<Map> store_target_map; | |
4927 if (it->GetReceiver()->IsJSObject()) { | |
4928 store_target_map = handle(it->GetStoreTarget()->map(), it->isolate()); | |
4929 } | |
4930 if (it->HolderIsReceiverOrHiddenPrototype()) { | 4926 if (it->HolderIsReceiverOrHiddenPrototype()) { |
4931 Maybe<bool> result = | 4927 Maybe<bool> result = |
4932 JSObject::SetPropertyWithInterceptor(it, should_throw, value); | 4928 JSObject::SetPropertyWithInterceptor(it, should_throw, value); |
4933 if (result.IsNothing() || result.FromJust()) return result; | 4929 if (result.IsNothing() || result.FromJust()) return result; |
4934 // Interceptor modified the store target but failed to set the | |
4935 // property. | |
4936 Utils::ApiCheck(store_target_map.is_null() || | |
4937 *store_target_map == it->GetStoreTarget()->map(), | |
4938 it->IsElement() ? "v8::IndexedPropertySetterCallback" | |
4939 : "v8::NamedPropertySetterCallback", | |
4940 "Interceptor silently changed store target."); | |
4941 } else { | 4930 } else { |
4942 Maybe<PropertyAttributes> maybe_attributes = | 4931 Maybe<PropertyAttributes> maybe_attributes = |
4943 JSObject::GetPropertyAttributesWithInterceptor(it); | 4932 JSObject::GetPropertyAttributesWithInterceptor(it); |
4944 if (!maybe_attributes.IsJust()) return Nothing<bool>(); | 4933 if (!maybe_attributes.IsJust()) return Nothing<bool>(); |
4945 if ((maybe_attributes.FromJust() & READ_ONLY) != 0) { | 4934 if ((maybe_attributes.FromJust() & READ_ONLY) != 0) { |
4946 return WriteToReadOnlyProperty(it, value, should_throw); | 4935 return WriteToReadOnlyProperty(it, value, should_throw); |
4947 } | 4936 } |
4948 // Interceptor modified the store target but failed to set the | |
4949 // property. | |
4950 Utils::ApiCheck(store_target_map.is_null() || | |
4951 *store_target_map == it->GetStoreTarget()->map(), | |
4952 it->IsElement() ? "v8::IndexedPropertySetterCallback" | |
4953 : "v8::NamedPropertySetterCallback", | |
4954 "Interceptor silently changed store target."); | |
4955 if (maybe_attributes.FromJust() == ABSENT) break; | 4937 if (maybe_attributes.FromJust() == ABSENT) break; |
4956 *found = false; | 4938 *found = false; |
4957 return Nothing<bool>(); | 4939 return Nothing<bool>(); |
4958 } | 4940 } |
4959 break; | 4941 break; |
4960 } | 4942 } |
4961 | 4943 |
4962 case LookupIterator::ACCESSOR: { | 4944 case LookupIterator::ACCESSOR: { |
4963 if (it->IsReadOnly()) { | 4945 if (it->IsReadOnly()) { |
4964 return WriteToReadOnlyProperty(it, value, should_throw); | 4946 return WriteToReadOnlyProperty(it, value, should_throw); |
(...skipping 1869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6834 if (!it.HasAccess()) { | 6816 if (!it.HasAccess()) { |
6835 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | 6817 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); |
6836 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 6818 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
6837 return Just(true); | 6819 return Just(true); |
6838 } | 6820 } |
6839 it.Next(); | 6821 it.Next(); |
6840 } | 6822 } |
6841 | 6823 |
6842 // Handle interceptor | 6824 // Handle interceptor |
6843 if (it.state() == LookupIterator::INTERCEPTOR) { | 6825 if (it.state() == LookupIterator::INTERCEPTOR) { |
6844 Handle<Map> store_target_map; | |
6845 if (it.GetReceiver()->IsJSObject()) { | |
6846 store_target_map = handle(it.GetStoreTarget()->map(), it.isolate()); | |
6847 } | |
6848 if (it.HolderIsReceiverOrHiddenPrototype()) { | 6826 if (it.HolderIsReceiverOrHiddenPrototype()) { |
6849 Maybe<bool> result = DefinePropertyWithInterceptorInternal( | 6827 Maybe<bool> result = DefinePropertyWithInterceptorInternal( |
6850 &it, it.GetInterceptor(), should_throw, *desc); | 6828 &it, it.GetInterceptor(), should_throw, *desc); |
6851 if (result.IsNothing() || result.FromJust()) { | 6829 if (result.IsNothing() || result.FromJust()) { |
6852 return result; | 6830 return result; |
6853 } | 6831 } |
6854 // Interceptor modified the store target but failed to set the | |
6855 // property. | |
6856 if (!store_target_map.is_null() && | |
6857 *store_target_map != it.GetStoreTarget()->map()) { | |
6858 it.isolate()->PushStackTraceAndDie( | |
6859 0xabababaa, v8::ToCData<void*>(it.GetInterceptor()->definer()), | |
6860 nullptr, 0xabababab); | |
6861 } | |
6862 Utils::ApiCheck(store_target_map.is_null() || | |
6863 *store_target_map == it.GetStoreTarget()->map(), | |
6864 it.IsElement() ? "v8::IndexedPropertyDefinerCallback" | |
6865 : "v8::NamedPropertyDefinerCallback", | |
6866 "Interceptor silently changed store target."); | |
6867 } | 6832 } |
6868 } | 6833 } |
6869 | 6834 |
6870 return OrdinaryDefineOwnProperty(&it, desc, should_throw); | 6835 return OrdinaryDefineOwnProperty(&it, desc, should_throw); |
6871 } | 6836 } |
6872 | 6837 |
6873 | 6838 |
6874 // ES6 9.1.6.1 | 6839 // ES6 9.1.6.1 |
6875 // static | 6840 // static |
6876 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it, | 6841 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it, |
(...skipping 13614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20491 // depend on this. | 20456 // depend on this. |
20492 return DICTIONARY_ELEMENTS; | 20457 return DICTIONARY_ELEMENTS; |
20493 } | 20458 } |
20494 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20459 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
20495 return kind; | 20460 return kind; |
20496 } | 20461 } |
20497 } | 20462 } |
20498 | 20463 |
20499 } // namespace internal | 20464 } // namespace internal |
20500 } // namespace v8 | 20465 } // namespace v8 |
OLD | NEW |