| 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 <iomanip> | 5 #include <iomanip> |
| 6 #include <sstream> | 6 #include <sstream> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 name, receiver), | 327 name, receiver), |
| 328 Object); | 328 Object); |
| 329 } | 329 } |
| 330 | 330 |
| 331 v8::AccessorNameGetterCallback call_fun = | 331 v8::AccessorNameGetterCallback call_fun = |
| 332 v8::ToCData<v8::AccessorNameGetterCallback>(info->getter()); | 332 v8::ToCData<v8::AccessorNameGetterCallback>(info->getter()); |
| 333 if (call_fun == nullptr) return isolate->factory()->undefined_value(); | 333 if (call_fun == nullptr) return isolate->factory()->undefined_value(); |
| 334 | 334 |
| 335 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); | 335 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); |
| 336 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); | 336 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); |
| 337 v8::Handle<v8::Value> result = | 337 v8::Local<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(name)); |
| 338 args.Call(call_fun, v8::Utils::ToLocal(name)); | |
| 339 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 338 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 340 if (result.IsEmpty()) { | 339 if (result.IsEmpty()) { |
| 341 return ReadAbsentProperty(isolate, receiver, name, language_mode); | 340 return ReadAbsentProperty(isolate, receiver, name, language_mode); |
| 342 } | 341 } |
| 343 Handle<Object> return_value = v8::Utils::OpenHandle(*result); | 342 Handle<Object> return_value = v8::Utils::OpenHandle(*result); |
| 344 return_value->VerifyApiCallResultType(); | 343 return_value->VerifyApiCallResultType(); |
| 345 // Rebox handle before return. | 344 // Rebox handle before return. |
| 346 return handle(*return_value, isolate); | 345 return handle(*return_value, isolate); |
| 347 } | 346 } |
| 348 | 347 |
| (...skipping 2626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2975 Isolate* isolate = it->isolate(); | 2974 Isolate* isolate = it->isolate(); |
| 2976 // Make sure that the top context does not change when doing callbacks or | 2975 // Make sure that the top context does not change when doing callbacks or |
| 2977 // interceptor calls. | 2976 // interceptor calls. |
| 2978 AssertNoContextChange ncc(isolate); | 2977 AssertNoContextChange ncc(isolate); |
| 2979 | 2978 |
| 2980 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 2979 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 2981 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 2980 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 2982 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); | 2981 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); |
| 2983 | 2982 |
| 2984 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 2983 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 2985 v8::Handle<v8::Value> result; | 2984 v8::Local<v8::Value> result; |
| 2986 PropertyCallbackArguments args(isolate, interceptor->data(), | 2985 PropertyCallbackArguments args(isolate, interceptor->data(), |
| 2987 *it->GetReceiver(), *holder); | 2986 *it->GetReceiver(), *holder); |
| 2988 | 2987 |
| 2989 if (it->IsElement()) { | 2988 if (it->IsElement()) { |
| 2990 uint32_t index = it->index(); | 2989 uint32_t index = it->index(); |
| 2991 v8::IndexedPropertySetterCallback setter = | 2990 v8::IndexedPropertySetterCallback setter = |
| 2992 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); | 2991 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); |
| 2993 LOG(isolate, | 2992 LOG(isolate, |
| 2994 ApiIndexedPropertyAccess("interceptor-indexed-set", *holder, index)); | 2993 ApiIndexedPropertyAccess("interceptor-indexed-set", *holder, index)); |
| 2995 result = args.Call(setter, index, v8::Utils::ToLocal(value)); | 2994 result = args.Call(setter, index, v8::Utils::ToLocal(value)); |
| (...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4340 | 4339 |
| 4341 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 4340 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 4342 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 4341 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 4343 if (!it->IsElement() && it->name()->IsSymbol() && | 4342 if (!it->IsElement() && it->name()->IsSymbol() && |
| 4344 !interceptor->can_intercept_symbols()) { | 4343 !interceptor->can_intercept_symbols()) { |
| 4345 return Just(ABSENT); | 4344 return Just(ABSENT); |
| 4346 } | 4345 } |
| 4347 PropertyCallbackArguments args(isolate, interceptor->data(), | 4346 PropertyCallbackArguments args(isolate, interceptor->data(), |
| 4348 *it->GetReceiver(), *holder); | 4347 *it->GetReceiver(), *holder); |
| 4349 if (!interceptor->query()->IsUndefined()) { | 4348 if (!interceptor->query()->IsUndefined()) { |
| 4350 v8::Handle<v8::Integer> result; | 4349 v8::Local<v8::Integer> result; |
| 4351 if (it->IsElement()) { | 4350 if (it->IsElement()) { |
| 4352 uint32_t index = it->index(); | 4351 uint32_t index = it->index(); |
| 4353 v8::IndexedPropertyQueryCallback query = | 4352 v8::IndexedPropertyQueryCallback query = |
| 4354 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); | 4353 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); |
| 4355 LOG(isolate, | 4354 LOG(isolate, |
| 4356 ApiIndexedPropertyAccess("interceptor-indexed-has", *holder, index)); | 4355 ApiIndexedPropertyAccess("interceptor-indexed-has", *holder, index)); |
| 4357 result = args.Call(query, index); | 4356 result = args.Call(query, index); |
| 4358 } else { | 4357 } else { |
| 4359 Handle<Name> name = it->name(); | 4358 Handle<Name> name = it->name(); |
| 4360 v8::GenericNamedPropertyQueryCallback query = | 4359 v8::GenericNamedPropertyQueryCallback query = |
| 4361 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( | 4360 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| 4362 interceptor->query()); | 4361 interceptor->query()); |
| 4363 LOG(isolate, | 4362 LOG(isolate, |
| 4364 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); | 4363 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| 4365 result = args.Call(query, v8::Utils::ToLocal(name)); | 4364 result = args.Call(query, v8::Utils::ToLocal(name)); |
| 4366 } | 4365 } |
| 4367 if (!result.IsEmpty()) { | 4366 if (!result.IsEmpty()) { |
| 4368 DCHECK(result->IsInt32()); | 4367 DCHECK(result->IsInt32()); |
| 4369 return Just(static_cast<PropertyAttributes>( | 4368 return Just(static_cast<PropertyAttributes>( |
| 4370 result->Int32Value(reinterpret_cast<v8::Isolate*>(isolate) | 4369 result->Int32Value(reinterpret_cast<v8::Isolate*>(isolate) |
| 4371 ->GetCurrentContext()).FromJust())); | 4370 ->GetCurrentContext()).FromJust())); |
| 4372 } | 4371 } |
| 4373 } else if (!interceptor->getter()->IsUndefined()) { | 4372 } else if (!interceptor->getter()->IsUndefined()) { |
| 4374 // TODO(verwaest): Use GetPropertyWithInterceptor? | 4373 // TODO(verwaest): Use GetPropertyWithInterceptor? |
| 4375 v8::Handle<v8::Value> result; | 4374 v8::Local<v8::Value> result; |
| 4376 if (it->IsElement()) { | 4375 if (it->IsElement()) { |
| 4377 uint32_t index = it->index(); | 4376 uint32_t index = it->index(); |
| 4378 v8::IndexedPropertyGetterCallback getter = | 4377 v8::IndexedPropertyGetterCallback getter = |
| 4379 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 4378 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 4380 LOG(isolate, ApiIndexedPropertyAccess("interceptor-indexed-get-has", | 4379 LOG(isolate, ApiIndexedPropertyAccess("interceptor-indexed-get-has", |
| 4381 *holder, index)); | 4380 *holder, index)); |
| 4382 result = args.Call(getter, index); | 4381 result = args.Call(getter, index); |
| 4383 } else { | 4382 } else { |
| 4384 Handle<Name> name = it->name(); | 4383 Handle<Name> name = it->name(); |
| 4385 | 4384 |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5107 AssertNoContextChange ncc(isolate); | 5106 AssertNoContextChange ncc(isolate); |
| 5108 | 5107 |
| 5109 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 5108 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 5110 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); | 5109 Handle<InterceptorInfo> interceptor(it->GetInterceptor()); |
| 5111 if (interceptor->deleter()->IsUndefined()) return MaybeHandle<Object>(); | 5110 if (interceptor->deleter()->IsUndefined()) return MaybeHandle<Object>(); |
| 5112 | 5111 |
| 5113 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 5112 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 5114 | 5113 |
| 5115 PropertyCallbackArguments args(isolate, interceptor->data(), | 5114 PropertyCallbackArguments args(isolate, interceptor->data(), |
| 5116 *it->GetReceiver(), *holder); | 5115 *it->GetReceiver(), *holder); |
| 5117 v8::Handle<v8::Boolean> result; | 5116 v8::Local<v8::Boolean> result; |
| 5118 if (it->IsElement()) { | 5117 if (it->IsElement()) { |
| 5119 uint32_t index = it->index(); | 5118 uint32_t index = it->index(); |
| 5120 v8::IndexedPropertyDeleterCallback deleter = | 5119 v8::IndexedPropertyDeleterCallback deleter = |
| 5121 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); | 5120 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
| 5122 LOG(isolate, | 5121 LOG(isolate, |
| 5123 ApiIndexedPropertyAccess("interceptor-indexed-delete", *holder, index)); | 5122 ApiIndexedPropertyAccess("interceptor-indexed-delete", *holder, index)); |
| 5124 result = args.Call(deleter, index); | 5123 result = args.Call(deleter, index); |
| 5125 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { | 5124 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 5126 return MaybeHandle<Object>(); | 5125 return MaybeHandle<Object>(); |
| 5127 } else { | 5126 } else { |
| (...skipping 7766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12894 // interceptor calls. | 12893 // interceptor calls. |
| 12895 AssertNoContextChange ncc(isolate); | 12894 AssertNoContextChange ncc(isolate); |
| 12896 | 12895 |
| 12897 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); | 12896 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); |
| 12898 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); | 12897 Handle<InterceptorInfo> interceptor = it->GetInterceptor(); |
| 12899 if (interceptor->getter()->IsUndefined()) { | 12898 if (interceptor->getter()->IsUndefined()) { |
| 12900 return isolate->factory()->undefined_value(); | 12899 return isolate->factory()->undefined_value(); |
| 12901 } | 12900 } |
| 12902 | 12901 |
| 12903 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 12902 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 12904 v8::Handle<v8::Value> result; | 12903 v8::Local<v8::Value> result; |
| 12905 PropertyCallbackArguments args(isolate, interceptor->data(), | 12904 PropertyCallbackArguments args(isolate, interceptor->data(), |
| 12906 *it->GetReceiver(), *holder); | 12905 *it->GetReceiver(), *holder); |
| 12907 | 12906 |
| 12908 if (it->IsElement()) { | 12907 if (it->IsElement()) { |
| 12909 uint32_t index = it->index(); | 12908 uint32_t index = it->index(); |
| 12910 v8::IndexedPropertyGetterCallback getter = | 12909 v8::IndexedPropertyGetterCallback getter = |
| 12911 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 12910 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 12912 LOG(isolate, | 12911 LOG(isolate, |
| 12913 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); | 12912 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); |
| 12914 result = args.Call(getter, index); | 12913 result = args.Call(getter, index); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 12937 } | 12936 } |
| 12938 | 12937 |
| 12939 | 12938 |
| 12940 // Compute the property keys from the interceptor. | 12939 // Compute the property keys from the interceptor. |
| 12941 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( | 12940 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| 12942 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 12941 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| 12943 Isolate* isolate = receiver->GetIsolate(); | 12942 Isolate* isolate = receiver->GetIsolate(); |
| 12944 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 12943 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 12945 PropertyCallbackArguments | 12944 PropertyCallbackArguments |
| 12946 args(isolate, interceptor->data(), *receiver, *object); | 12945 args(isolate, interceptor->data(), *receiver, *object); |
| 12947 v8::Handle<v8::Object> result; | 12946 v8::Local<v8::Object> result; |
| 12948 if (!interceptor->enumerator()->IsUndefined()) { | 12947 if (!interceptor->enumerator()->IsUndefined()) { |
| 12949 v8::GenericNamedPropertyEnumeratorCallback enum_fun = | 12948 v8::GenericNamedPropertyEnumeratorCallback enum_fun = |
| 12950 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( | 12949 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( |
| 12951 interceptor->enumerator()); | 12950 interceptor->enumerator()); |
| 12952 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 12951 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
| 12953 result = args.Call(enum_fun); | 12952 result = args.Call(enum_fun); |
| 12954 } | 12953 } |
| 12955 if (result.IsEmpty()) return MaybeHandle<JSObject>(); | 12954 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
| 12956 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || | 12955 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 12957 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); | 12956 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
| 12958 // Rebox before returning. | 12957 // Rebox before returning. |
| 12959 return handle(*v8::Utils::OpenHandle(*result), isolate); | 12958 return handle(*v8::Utils::OpenHandle(*result), isolate); |
| 12960 } | 12959 } |
| 12961 | 12960 |
| 12962 | 12961 |
| 12963 // Compute the element keys from the interceptor. | 12962 // Compute the element keys from the interceptor. |
| 12964 MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor( | 12963 MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor( |
| 12965 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 12964 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| 12966 Isolate* isolate = receiver->GetIsolate(); | 12965 Isolate* isolate = receiver->GetIsolate(); |
| 12967 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); | 12966 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
| 12968 PropertyCallbackArguments | 12967 PropertyCallbackArguments |
| 12969 args(isolate, interceptor->data(), *receiver, *object); | 12968 args(isolate, interceptor->data(), *receiver, *object); |
| 12970 v8::Handle<v8::Object> result; | 12969 v8::Local<v8::Object> result; |
| 12971 if (!interceptor->enumerator()->IsUndefined()) { | 12970 if (!interceptor->enumerator()->IsUndefined()) { |
| 12972 v8::IndexedPropertyEnumeratorCallback enum_fun = | 12971 v8::IndexedPropertyEnumeratorCallback enum_fun = |
| 12973 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>( | 12972 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>( |
| 12974 interceptor->enumerator()); | 12973 interceptor->enumerator()); |
| 12975 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); | 12974 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); |
| 12976 result = args.Call(enum_fun); | 12975 result = args.Call(enum_fun); |
| 12977 } | 12976 } |
| 12978 if (result.IsEmpty()) return MaybeHandle<JSObject>(); | 12977 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
| 12979 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || | 12978 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 12980 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); | 12979 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
| (...skipping 3168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16149 Handle<Object> new_value) { | 16148 Handle<Object> new_value) { |
| 16150 if (cell->value() != *new_value) { | 16149 if (cell->value() != *new_value) { |
| 16151 cell->set_value(*new_value); | 16150 cell->set_value(*new_value); |
| 16152 Isolate* isolate = cell->GetIsolate(); | 16151 Isolate* isolate = cell->GetIsolate(); |
| 16153 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16152 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 16154 isolate, DependentCode::kPropertyCellChangedGroup); | 16153 isolate, DependentCode::kPropertyCellChangedGroup); |
| 16155 } | 16154 } |
| 16156 } | 16155 } |
| 16157 } // namespace internal | 16156 } // namespace internal |
| 16158 } // namespace v8 | 16157 } // namespace v8 |
| OLD | NEW |