| 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 <sstream> | 5 #include <sstream> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
| (...skipping 2855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2866 break; | 2866 break; |
| 2867 } | 2867 } |
| 2868 } | 2868 } |
| 2869 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); | 2869 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); |
| 2870 return handle(new_map); | 2870 return handle(new_map); |
| 2871 } | 2871 } |
| 2872 | 2872 |
| 2873 | 2873 |
| 2874 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, | 2874 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, |
| 2875 Handle<Object> value) { | 2875 Handle<Object> value) { |
| 2876 // TODO(rossberg): Support symbols in the API. | 2876 Handle<Name> name = it->name(); |
| 2877 if (it->name()->IsSymbol()) return value; | |
| 2878 | |
| 2879 Handle<String> name_string = Handle<String>::cast(it->name()); | |
| 2880 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 2877 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 2881 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 2878 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 2882 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); | 2879 if (interceptor->setter()->IsUndefined() || |
| 2880 (name->IsSymbol() && !interceptor->can_intercept_symbols())) { |
| 2881 return MaybeHandle<Object>(); |
| 2882 } |
| 2883 | 2883 |
| 2884 LOG(it->isolate(), | 2884 LOG(it->isolate(), |
| 2885 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name_string)); | 2885 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); |
| 2886 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, | 2886 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, |
| 2887 *holder); | 2887 *holder); |
| 2888 v8::NamedPropertySetterCallback setter = | 2888 v8::GenericNamedPropertySetterCallback setter = |
| 2889 v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); | 2889 v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
| 2890 v8::Handle<v8::Value> result = args.Call( | 2890 interceptor->setter()); |
| 2891 setter, v8::Utils::ToLocal(name_string), v8::Utils::ToLocal(value)); | 2891 v8::Handle<v8::Value> result = |
| 2892 args.Call(setter, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); |
| 2892 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); | 2893 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| 2893 if (!result.IsEmpty()) return value; | 2894 if (!result.IsEmpty()) return value; |
| 2894 | 2895 |
| 2895 return MaybeHandle<Object>(); | 2896 return MaybeHandle<Object>(); |
| 2896 } | 2897 } |
| 2897 | 2898 |
| 2898 | 2899 |
| 2899 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, | 2900 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, |
| 2900 Handle<Name> name, Handle<Object> value, | 2901 Handle<Name> name, Handle<Object> value, |
| 2901 StrictMode strict_mode, | 2902 StrictMode strict_mode, |
| (...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4067 | 4068 |
| 4068 return AddDataProperty(&it, value, attributes, STRICT, | 4069 return AddDataProperty(&it, value, attributes, STRICT, |
| 4069 CERTAINLY_NOT_STORE_FROM_KEYED); | 4070 CERTAINLY_NOT_STORE_FROM_KEYED); |
| 4070 } | 4071 } |
| 4071 | 4072 |
| 4072 | 4073 |
| 4073 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 4074 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
| 4074 Handle<JSObject> holder, | 4075 Handle<JSObject> holder, |
| 4075 Handle<Object> receiver, | 4076 Handle<Object> receiver, |
| 4076 Handle<Name> name) { | 4077 Handle<Name> name) { |
| 4077 // TODO(rossberg): Support symbols in the API. | |
| 4078 if (name->IsSymbol()) return maybe(ABSENT); | |
| 4079 | |
| 4080 Isolate* isolate = holder->GetIsolate(); | 4078 Isolate* isolate = holder->GetIsolate(); |
| 4081 HandleScope scope(isolate); | 4079 HandleScope scope(isolate); |
| 4082 | 4080 |
| 4083 // Make sure that the top context does not change when doing | 4081 // Make sure that the top context does not change when doing |
| 4084 // callbacks or interceptor calls. | 4082 // callbacks or interceptor calls. |
| 4085 AssertNoContextChange ncc(isolate); | 4083 AssertNoContextChange ncc(isolate); |
| 4086 | 4084 |
| 4087 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 4085 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 4086 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 4087 return maybe(ABSENT); |
| 4088 } |
| 4088 PropertyCallbackArguments args( | 4089 PropertyCallbackArguments args( |
| 4089 isolate, interceptor->data(), *receiver, *holder); | 4090 isolate, interceptor->data(), *receiver, *holder); |
| 4090 if (!interceptor->query()->IsUndefined()) { | 4091 if (!interceptor->query()->IsUndefined()) { |
| 4091 v8::NamedPropertyQueryCallback query = | 4092 v8::GenericNamedPropertyQueryCallback query = |
| 4092 v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); | 4093 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| 4094 interceptor->query()); |
| 4093 LOG(isolate, | 4095 LOG(isolate, |
| 4094 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); | 4096 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| 4095 v8::Handle<v8::Integer> result = | 4097 v8::Handle<v8::Integer> result = args.Call(query, v8::Utils::ToLocal(name)); |
| 4096 args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
| 4097 if (!result.IsEmpty()) { | 4098 if (!result.IsEmpty()) { |
| 4098 DCHECK(result->IsInt32()); | 4099 DCHECK(result->IsInt32()); |
| 4099 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); | 4100 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
| 4100 } | 4101 } |
| 4101 } else if (!interceptor->getter()->IsUndefined()) { | 4102 } else if (!interceptor->getter()->IsUndefined()) { |
| 4102 v8::NamedPropertyGetterCallback getter = | 4103 v8::GenericNamedPropertyGetterCallback getter = |
| 4103 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 4104 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 4105 interceptor->getter()); |
| 4104 LOG(isolate, | 4106 LOG(isolate, |
| 4105 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); | 4107 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
| 4106 v8::Handle<v8::Value> result = | 4108 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
| 4107 args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
| 4108 if (!result.IsEmpty()) return maybe(DONT_ENUM); | 4109 if (!result.IsEmpty()) return maybe(DONT_ENUM); |
| 4109 } | 4110 } |
| 4110 | 4111 |
| 4111 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); | 4112 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); |
| 4112 return maybe(ABSENT); | 4113 return maybe(ABSENT); |
| 4113 } | 4114 } |
| 4114 | 4115 |
| 4115 | 4116 |
| 4116 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( | 4117 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( |
| 4117 Handle<JSReceiver> object, Handle<Name> name) { | 4118 Handle<JSReceiver> object, Handle<Name> name) { |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4925 Handle<Name> name = isolate->factory()->hidden_string(); | 4926 Handle<Name> name = isolate->factory()->hidden_string(); |
| 4926 SetOwnPropertyIgnoreAttributes(object, name, value, DONT_ENUM).Assert(); | 4927 SetOwnPropertyIgnoreAttributes(object, name, value, DONT_ENUM).Assert(); |
| 4927 return object; | 4928 return object; |
| 4928 } | 4929 } |
| 4929 | 4930 |
| 4930 | 4931 |
| 4931 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( | 4932 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
| 4932 Handle<JSObject> holder, Handle<JSObject> receiver, Handle<Name> name) { | 4933 Handle<JSObject> holder, Handle<JSObject> receiver, Handle<Name> name) { |
| 4933 Isolate* isolate = holder->GetIsolate(); | 4934 Isolate* isolate = holder->GetIsolate(); |
| 4934 | 4935 |
| 4935 // TODO(rossberg): Support symbols in the API. | 4936 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 4936 if (name->IsSymbol()) return MaybeHandle<Object>(); | 4937 if (interceptor->deleter()->IsUndefined() || |
| 4938 (name->IsSymbol() && !interceptor->can_intercept_symbols())) { |
| 4939 return MaybeHandle<Object>(); |
| 4940 } |
| 4937 | 4941 |
| 4938 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 4942 v8::GenericNamedPropertyDeleterCallback deleter = |
| 4939 if (interceptor->deleter()->IsUndefined()) return MaybeHandle<Object>(); | 4943 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( |
| 4940 | 4944 interceptor->deleter()); |
| 4941 v8::NamedPropertyDeleterCallback deleter = | |
| 4942 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); | |
| 4943 LOG(isolate, | 4945 LOG(isolate, |
| 4944 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); | 4946 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); |
| 4945 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, | 4947 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
| 4946 *holder); | 4948 *holder); |
| 4947 v8::Handle<v8::Boolean> result = | 4949 v8::Handle<v8::Boolean> result = args.Call(deleter, v8::Utils::ToLocal(name)); |
| 4948 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
| 4949 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 4950 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 4950 if (result.IsEmpty()) return MaybeHandle<Object>(); | 4951 if (result.IsEmpty()) return MaybeHandle<Object>(); |
| 4951 | 4952 |
| 4952 DCHECK(result->IsBoolean()); | 4953 DCHECK(result->IsBoolean()); |
| 4953 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4954 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 4954 result_internal->VerifyApiCallResultType(); | 4955 result_internal->VerifyApiCallResultType(); |
| 4955 // Rebox CustomArguments::kReturnValueOffset before returning. | 4956 // Rebox CustomArguments::kReturnValueOffset before returning. |
| 4956 return handle(*result_internal, isolate); | 4957 return handle(*result_internal, isolate); |
| 4957 } | 4958 } |
| 4958 | 4959 |
| (...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6056 !current->HasNamedInterceptor() && | 6057 !current->HasNamedInterceptor() && |
| 6057 !current->HasIndexedInterceptor()); | 6058 !current->HasIndexedInterceptor()); |
| 6058 // Compute the property keys and cache them if possible. | 6059 // Compute the property keys and cache them if possible. |
| 6059 ASSIGN_RETURN_ON_EXCEPTION( | 6060 ASSIGN_RETURN_ON_EXCEPTION( |
| 6060 isolate, content, | 6061 isolate, content, |
| 6061 FixedArray::UnionOfKeys( | 6062 FixedArray::UnionOfKeys( |
| 6062 content, GetEnumPropertyKeys(current, cache_enum_keys)), | 6063 content, GetEnumPropertyKeys(current, cache_enum_keys)), |
| 6063 FixedArray); | 6064 FixedArray); |
| 6064 DCHECK(ContainsOnlyValidKeys(content)); | 6065 DCHECK(ContainsOnlyValidKeys(content)); |
| 6065 | 6066 |
| 6066 // Add the property keys from the interceptor. | 6067 // Add the non-symbol property keys from the interceptor. |
| 6067 if (current->HasNamedInterceptor()) { | 6068 if (current->HasNamedInterceptor()) { |
| 6068 Handle<JSObject> result; | 6069 Handle<JSObject> result; |
| 6069 if (JSObject::GetKeysForNamedInterceptor( | 6070 if (JSObject::GetKeysForNamedInterceptor( |
| 6070 current, object).ToHandle(&result)) { | 6071 current, object).ToHandle(&result)) { |
| 6071 ASSIGN_RETURN_ON_EXCEPTION( | 6072 ASSIGN_RETURN_ON_EXCEPTION( |
| 6072 isolate, content, | 6073 isolate, content, FixedArray::AddKeysFromArrayLike( |
| 6073 FixedArray::AddKeysFromArrayLike(content, result), | 6074 content, result, FixedArray::NON_SYMBOL_KEYS), |
| 6074 FixedArray); | 6075 FixedArray); |
| 6075 } | 6076 } |
| 6076 DCHECK(ContainsOnlyValidKeys(content)); | 6077 DCHECK(ContainsOnlyValidKeys(content)); |
| 6077 } | 6078 } |
| 6078 | 6079 |
| 6079 // If we only want own properties we bail out after the first | 6080 // If we only want own properties we bail out after the first |
| 6080 // iteration. | 6081 // iteration. |
| 6081 if (type == OWN_ONLY) break; | 6082 if (type == OWN_ONLY) break; |
| 6082 } | 6083 } |
| 6083 return content; | 6084 return content; |
| (...skipping 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7988 void FixedArray::Shrink(int new_length) { | 7989 void FixedArray::Shrink(int new_length) { |
| 7989 DCHECK(0 <= new_length && new_length <= length()); | 7990 DCHECK(0 <= new_length && new_length <= length()); |
| 7990 if (new_length < length()) { | 7991 if (new_length < length()) { |
| 7991 GetHeap()->RightTrimFixedArray<Heap::FROM_MUTATOR>( | 7992 GetHeap()->RightTrimFixedArray<Heap::FROM_MUTATOR>( |
| 7992 this, length() - new_length); | 7993 this, length() - new_length); |
| 7993 } | 7994 } |
| 7994 } | 7995 } |
| 7995 | 7996 |
| 7996 | 7997 |
| 7997 MaybeHandle<FixedArray> FixedArray::AddKeysFromArrayLike( | 7998 MaybeHandle<FixedArray> FixedArray::AddKeysFromArrayLike( |
| 7998 Handle<FixedArray> content, | 7999 Handle<FixedArray> content, Handle<JSObject> array, KeyFilter filter) { |
| 7999 Handle<JSObject> array) { | |
| 8000 DCHECK(array->IsJSArray() || array->HasSloppyArgumentsElements()); | 8000 DCHECK(array->IsJSArray() || array->HasSloppyArgumentsElements()); |
| 8001 ElementsAccessor* accessor = array->GetElementsAccessor(); | 8001 ElementsAccessor* accessor = array->GetElementsAccessor(); |
| 8002 Handle<FixedArray> result; | 8002 Handle<FixedArray> result; |
| 8003 ASSIGN_RETURN_ON_EXCEPTION( | 8003 ASSIGN_RETURN_ON_EXCEPTION( |
| 8004 array->GetIsolate(), result, | 8004 array->GetIsolate(), result, |
| 8005 accessor->AddElementsToFixedArray(array, array, content), | 8005 accessor->AddElementsToFixedArray(array, array, content, filter), |
| 8006 FixedArray); | 8006 FixedArray); |
| 8007 | 8007 |
| 8008 #ifdef ENABLE_SLOW_DCHECKS | 8008 #ifdef ENABLE_SLOW_DCHECKS |
| 8009 if (FLAG_enable_slow_asserts) { | 8009 if (FLAG_enable_slow_asserts) { |
| 8010 DisallowHeapAllocation no_allocation; | 8010 DisallowHeapAllocation no_allocation; |
| 8011 for (int i = 0; i < result->length(); i++) { | 8011 for (int i = 0; i < result->length(); i++) { |
| 8012 Object* current = result->get(i); | 8012 Object* current = result->get(i); |
| 8013 DCHECK(current->IsNumber() || current->IsName()); | 8013 DCHECK(current->IsNumber() || current->IsName()); |
| 8014 } | 8014 } |
| 8015 } | 8015 } |
| 8016 #endif | 8016 #endif |
| 8017 return result; | 8017 return result; |
| 8018 } | 8018 } |
| 8019 | 8019 |
| 8020 | 8020 |
| 8021 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, | 8021 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, |
| 8022 Handle<FixedArray> second) { | 8022 Handle<FixedArray> second) { |
| 8023 ElementsAccessor* accessor = ElementsAccessor::ForArray(second); | 8023 ElementsAccessor* accessor = ElementsAccessor::ForArray(second); |
| 8024 Handle<FixedArray> result; | 8024 Handle<FixedArray> result; |
| 8025 ASSIGN_RETURN_ON_EXCEPTION( | 8025 ASSIGN_RETURN_ON_EXCEPTION( |
| 8026 first->GetIsolate(), result, | 8026 first->GetIsolate(), result, |
| 8027 accessor->AddElementsToFixedArray( | 8027 accessor->AddElementsToFixedArray( |
| 8028 Handle<Object>::null(), // receiver | 8028 Handle<Object>::null(), // receiver |
| 8029 Handle<JSObject>::null(), // holder | 8029 Handle<JSObject>::null(), // holder |
| 8030 first, | 8030 first, Handle<FixedArrayBase>::cast(second), ALL_KEYS), |
| 8031 Handle<FixedArrayBase>::cast(second)), | |
| 8032 FixedArray); | 8031 FixedArray); |
| 8033 | 8032 |
| 8034 #ifdef ENABLE_SLOW_DCHECKS | 8033 #ifdef ENABLE_SLOW_DCHECKS |
| 8035 if (FLAG_enable_slow_asserts) { | 8034 if (FLAG_enable_slow_asserts) { |
| 8036 DisallowHeapAllocation no_allocation; | 8035 DisallowHeapAllocation no_allocation; |
| 8037 for (int i = 0; i < result->length(); i++) { | 8036 for (int i = 0; i < result->length(); i++) { |
| 8038 Object* current = result->get(i); | 8037 Object* current = result->get(i); |
| 8039 DCHECK(current->IsNumber() || current->IsName()); | 8038 DCHECK(current->IsNumber() || current->IsName()); |
| 8040 } | 8039 } |
| 8041 } | 8040 } |
| (...skipping 5399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13441 return InterceptorInfo::cast(result); | 13440 return InterceptorInfo::cast(result); |
| 13442 } | 13441 } |
| 13443 | 13442 |
| 13444 | 13443 |
| 13445 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( | 13444 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( |
| 13446 Handle<JSObject> holder, | 13445 Handle<JSObject> holder, |
| 13447 Handle<Object> receiver, | 13446 Handle<Object> receiver, |
| 13448 Handle<Name> name) { | 13447 Handle<Name> name) { |
| 13449 Isolate* isolate = holder->GetIsolate(); | 13448 Isolate* isolate = holder->GetIsolate(); |
| 13450 | 13449 |
| 13451 // TODO(rossberg): Support symbols in the API. | |
| 13452 if (name->IsSymbol()) return isolate->factory()->undefined_value(); | |
| 13453 | |
| 13454 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); | 13450 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); |
| 13455 Handle<String> name_string = Handle<String>::cast(name); | |
| 13456 | |
| 13457 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); | 13451 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); |
| 13458 | 13452 |
| 13459 v8::NamedPropertyGetterCallback getter = | 13453 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 13460 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 13454 return MaybeHandle<Object>(); |
| 13455 } |
| 13456 |
| 13457 v8::GenericNamedPropertyGetterCallback getter = |
| 13458 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 13459 interceptor->getter()); |
| 13461 LOG(isolate, | 13460 LOG(isolate, |
| 13462 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 13461 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
| 13463 PropertyCallbackArguments | 13462 PropertyCallbackArguments |
| 13464 args(isolate, interceptor->data(), *receiver, *holder); | 13463 args(isolate, interceptor->data(), *receiver, *holder); |
| 13465 v8::Handle<v8::Value> result = | 13464 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
| 13466 args.Call(getter, v8::Utils::ToLocal(name_string)); | |
| 13467 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 13465 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 13468 if (result.IsEmpty()) return MaybeHandle<Object>(); | 13466 if (result.IsEmpty()) return MaybeHandle<Object>(); |
| 13469 | 13467 |
| 13470 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 13468 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 13471 result_internal->VerifyApiCallResultType(); | 13469 result_internal->VerifyApiCallResultType(); |
| 13472 // Rebox handle before return | 13470 // Rebox handle before return |
| 13473 return handle(*result_internal, isolate); | 13471 return handle(*result_internal, isolate); |
| 13474 } | 13472 } |
| 13475 | 13473 |
| 13476 | 13474 |
| 13477 // Compute the property keys from the interceptor. | 13475 // Compute the property keys from the interceptor. |
| 13478 // TODO(rossberg): support symbols in API, and filter here if needed. | |
| 13479 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( | 13476 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| 13480 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 13477 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| 13481 Isolate* isolate = receiver->GetIsolate(); | 13478 Isolate* isolate = receiver->GetIsolate(); |
| 13482 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 13479 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 13483 PropertyCallbackArguments | 13480 PropertyCallbackArguments |
| 13484 args(isolate, interceptor->data(), *receiver, *object); | 13481 args(isolate, interceptor->data(), *receiver, *object); |
| 13485 v8::Handle<v8::Object> result; | 13482 v8::Handle<v8::Object> result; |
| 13486 if (!interceptor->enumerator()->IsUndefined()) { | 13483 if (!interceptor->enumerator()->IsUndefined()) { |
| 13487 v8::NamedPropertyEnumeratorCallback enum_fun = | 13484 v8::GenericNamedPropertyEnumeratorCallback enum_fun = |
| 13488 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( | 13485 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( |
| 13489 interceptor->enumerator()); | 13486 interceptor->enumerator()); |
| 13490 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 13487 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
| 13491 result = args.Call(enum_fun); | 13488 result = args.Call(enum_fun); |
| 13492 } | 13489 } |
| 13493 if (result.IsEmpty()) return MaybeHandle<JSObject>(); | 13490 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
| 13494 #if ENABLE_EXTRA_CHECKS | 13491 #if ENABLE_EXTRA_CHECKS |
| 13495 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || | 13492 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 13496 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); | 13493 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
| 13497 #endif | 13494 #endif |
| 13498 // Rebox before returning. | 13495 // Rebox before returning. |
| (...skipping 3326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16825 Handle<DependentCode> codes = | 16822 Handle<DependentCode> codes = |
| 16826 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16823 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
| 16827 DependentCode::kPropertyCellChangedGroup, | 16824 DependentCode::kPropertyCellChangedGroup, |
| 16828 info->object_wrapper()); | 16825 info->object_wrapper()); |
| 16829 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16826 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 16830 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16827 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 16831 cell, info->zone()); | 16828 cell, info->zone()); |
| 16832 } | 16829 } |
| 16833 | 16830 |
| 16834 } } // namespace v8::internal | 16831 } } // namespace v8::internal |
| OLD | NEW |