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 |