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 |