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 |