| 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 <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 4092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4103 // Make sure that the top context does not change when doing callbacks or | 4103 // Make sure that the top context does not change when doing callbacks or |
| 4104 // interceptor calls. | 4104 // interceptor calls. |
| 4105 AssertNoContextChange ncc(isolate); | 4105 AssertNoContextChange ncc(isolate); |
| 4106 | 4106 |
| 4107 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 4107 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 4108 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 4108 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 4109 if (interceptor->setter()->IsUndefined()) return Just(false); | 4109 if (interceptor->setter()->IsUndefined()) return Just(false); |
| 4110 | 4110 |
| 4111 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 4111 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 4112 bool result; | 4112 bool result; |
| 4113 PropertyCallbackArguments args(isolate, interceptor->data(), | 4113 Handle<Object> receiver = it->GetReceiver(); |
| 4114 *it->GetReceiver(), *holder, should_throw); | 4114 if (!receiver->IsJSReceiver()) { |
| 4115 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver, |
| 4116 Object::ConvertReceiver(isolate, receiver), |
| 4117 Nothing<bool>()); |
| 4118 } |
| 4119 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
| 4120 *holder, should_throw); |
| 4115 | 4121 |
| 4116 if (it->IsElement()) { | 4122 if (it->IsElement()) { |
| 4117 uint32_t index = it->index(); | 4123 uint32_t index = it->index(); |
| 4118 v8::IndexedPropertySetterCallback setter = | 4124 v8::IndexedPropertySetterCallback setter = |
| 4119 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); | 4125 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); |
| 4120 // TODO(neis): In the future, we may want to actually return the | 4126 // TODO(neis): In the future, we may want to actually return the |
| 4121 // interceptor's result, which then should be a boolean. | 4127 // interceptor's result, which then should be a boolean. |
| 4122 result = !args.Call(setter, index, value).is_null(); | 4128 result = !args.Call(setter, index, value).is_null(); |
| 4123 } else { | 4129 } else { |
| 4124 Handle<Name> name = it->name(); | 4130 Handle<Name> name = it->name(); |
| (...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5386 // callbacks or interceptor calls. | 5392 // callbacks or interceptor calls. |
| 5387 AssertNoContextChange ncc(isolate); | 5393 AssertNoContextChange ncc(isolate); |
| 5388 HandleScope scope(isolate); | 5394 HandleScope scope(isolate); |
| 5389 | 5395 |
| 5390 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 5396 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 5391 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 5397 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 5392 if (!it->IsElement() && it->name()->IsSymbol() && | 5398 if (!it->IsElement() && it->name()->IsSymbol() && |
| 5393 !interceptor->can_intercept_symbols()) { | 5399 !interceptor->can_intercept_symbols()) { |
| 5394 return Just(ABSENT); | 5400 return Just(ABSENT); |
| 5395 } | 5401 } |
| 5396 PropertyCallbackArguments args(isolate, interceptor->data(), | 5402 Handle<Object> receiver = it->GetReceiver(); |
| 5397 *it->GetReceiver(), *holder, | 5403 if (!receiver->IsJSReceiver()) { |
| 5398 Object::DONT_THROW); | 5404 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver, |
| 5405 Object::ConvertReceiver(isolate, receiver), |
| 5406 Nothing<PropertyAttributes>()); |
| 5407 } |
| 5408 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
| 5409 *holder, Object::DONT_THROW); |
| 5399 if (!interceptor->query()->IsUndefined()) { | 5410 if (!interceptor->query()->IsUndefined()) { |
| 5400 Handle<Object> result; | 5411 Handle<Object> result; |
| 5401 if (it->IsElement()) { | 5412 if (it->IsElement()) { |
| 5402 uint32_t index = it->index(); | 5413 uint32_t index = it->index(); |
| 5403 v8::IndexedPropertyQueryCallback query = | 5414 v8::IndexedPropertyQueryCallback query = |
| 5404 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); | 5415 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); |
| 5405 result = args.Call(query, index); | 5416 result = args.Call(query, index); |
| 5406 } else { | 5417 } else { |
| 5407 Handle<Name> name = it->name(); | 5418 Handle<Name> name = it->name(); |
| 5408 DCHECK(!name->IsPrivate()); | 5419 DCHECK(!name->IsPrivate()); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5832 Isolate* isolate = it->isolate(); | 5843 Isolate* isolate = it->isolate(); |
| 5833 // Make sure that the top context does not change when doing callbacks or | 5844 // Make sure that the top context does not change when doing callbacks or |
| 5834 // interceptor calls. | 5845 // interceptor calls. |
| 5835 AssertNoContextChange ncc(isolate); | 5846 AssertNoContextChange ncc(isolate); |
| 5836 | 5847 |
| 5837 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 5848 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 5838 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 5849 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 5839 if (interceptor->deleter()->IsUndefined()) return Nothing<bool>(); | 5850 if (interceptor->deleter()->IsUndefined()) return Nothing<bool>(); |
| 5840 | 5851 |
| 5841 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 5852 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 5853 Handle<Object> receiver = it->GetReceiver(); |
| 5854 if (!receiver->IsJSReceiver()) { |
| 5855 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, receiver, |
| 5856 Object::ConvertReceiver(isolate, receiver), |
| 5857 Nothing<bool>()); |
| 5858 } |
| 5842 | 5859 |
| 5843 PropertyCallbackArguments args(isolate, interceptor->data(), | 5860 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
| 5844 *it->GetReceiver(), *holder, should_throw); | 5861 *holder, should_throw); |
| 5845 Handle<Object> result; | 5862 Handle<Object> result; |
| 5846 if (it->IsElement()) { | 5863 if (it->IsElement()) { |
| 5847 uint32_t index = it->index(); | 5864 uint32_t index = it->index(); |
| 5848 v8::IndexedPropertyDeleterCallback deleter = | 5865 v8::IndexedPropertyDeleterCallback deleter = |
| 5849 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); | 5866 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
| 5850 result = args.Call(deleter, index); | 5867 result = args.Call(deleter, index); |
| 5851 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { | 5868 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 5852 return Nothing<bool>(); | 5869 return Nothing<bool>(); |
| 5853 } else { | 5870 } else { |
| 5854 Handle<Name> name = it->name(); | 5871 Handle<Name> name = it->name(); |
| (...skipping 9084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14939 AssertNoContextChange ncc(isolate); | 14956 AssertNoContextChange ncc(isolate); |
| 14940 | 14957 |
| 14941 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 14958 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 14942 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); | 14959 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); |
| 14943 if (interceptor->getter()->IsUndefined()) { | 14960 if (interceptor->getter()->IsUndefined()) { |
| 14944 return isolate->factory()->undefined_value(); | 14961 return isolate->factory()->undefined_value(); |
| 14945 } | 14962 } |
| 14946 | 14963 |
| 14947 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 14964 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 14948 Handle<Object> result; | 14965 Handle<Object> result; |
| 14949 PropertyCallbackArguments args(isolate, interceptor->data(), | 14966 Handle<Object> receiver = it->GetReceiver(); |
| 14950 *it->GetReceiver(), *holder, | 14967 if (!receiver->IsJSReceiver()) { |
| 14951 Object::DONT_THROW); | 14968 ASSIGN_RETURN_ON_EXCEPTION( |
| 14969 isolate, receiver, Object::ConvertReceiver(isolate, receiver), Object); |
| 14970 } |
| 14971 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
| 14972 *holder, Object::DONT_THROW); |
| 14952 | 14973 |
| 14953 if (it->IsElement()) { | 14974 if (it->IsElement()) { |
| 14954 uint32_t index = it->index(); | 14975 uint32_t index = it->index(); |
| 14955 v8::IndexedPropertyGetterCallback getter = | 14976 v8::IndexedPropertyGetterCallback getter = |
| 14956 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 14977 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 14957 result = args.Call(getter, index); | 14978 result = args.Call(getter, index); |
| 14958 } else { | 14979 } else { |
| 14959 Handle<Name> name = it->name(); | 14980 Handle<Name> name = it->name(); |
| 14960 DCHECK(!name->IsPrivate()); | 14981 DCHECK(!name->IsPrivate()); |
| 14961 | 14982 |
| (...skipping 3311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18273 if (cell->value() != *new_value) { | 18294 if (cell->value() != *new_value) { |
| 18274 cell->set_value(*new_value); | 18295 cell->set_value(*new_value); |
| 18275 Isolate* isolate = cell->GetIsolate(); | 18296 Isolate* isolate = cell->GetIsolate(); |
| 18276 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18297 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 18277 isolate, DependentCode::kPropertyCellChangedGroup); | 18298 isolate, DependentCode::kPropertyCellChangedGroup); |
| 18278 } | 18299 } |
| 18279 } | 18300 } |
| 18280 | 18301 |
| 18281 } // namespace internal | 18302 } // namespace internal |
| 18282 } // namespace v8 | 18303 } // namespace v8 |
| OLD | NEW |