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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
(...skipping 2769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2780 UNREACHABLE(); | 2780 UNREACHABLE(); |
2781 } | 2781 } |
2782 } | 2782 } |
2783 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); | 2783 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); |
2784 return handle(new_map); | 2784 return handle(new_map); |
2785 } | 2785 } |
2786 | 2786 |
2787 | 2787 |
2788 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, | 2788 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, |
2789 Handle<Object> value) { | 2789 Handle<Object> value) { |
2790 // TODO(rossberg): Support symbols in the API. | 2790 Handle<Name> name = it->name(); |
2791 if (it->name()->IsSymbol()) return value; | |
2792 | |
2793 Handle<String> name_string = Handle<String>::cast(it->name()); | |
2794 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 2791 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
2795 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 2792 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
2796 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); | 2793 if (interceptor->setter()->IsUndefined() || |
| 2794 (name->IsSymbol() && !interceptor->can_intercept_symbols())) { |
| 2795 return MaybeHandle<Object>(); |
| 2796 } |
2797 | 2797 |
2798 LOG(it->isolate(), | 2798 LOG(it->isolate(), |
2799 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name_string)); | 2799 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); |
2800 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, | 2800 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, |
2801 *holder); | 2801 *holder); |
2802 v8::NamedPropertySetterCallback setter = | 2802 v8::GenericNamedPropertySetterCallback setter = |
2803 v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); | 2803 v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
| 2804 interceptor->setter()); |
2804 v8::Handle<v8::Value> result = args.Call( | 2805 v8::Handle<v8::Value> result = args.Call( |
2805 setter, v8::Utils::ToLocal(name_string), v8::Utils::ToLocal(value)); | 2806 setter, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); |
2806 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); | 2807 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
2807 if (!result.IsEmpty()) return value; | 2808 if (!result.IsEmpty()) return value; |
2808 | 2809 |
2809 return MaybeHandle<Object>(); | 2810 return MaybeHandle<Object>(); |
2810 } | 2811 } |
2811 | 2812 |
2812 | 2813 |
2813 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, | 2814 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, |
2814 Handle<Name> name, Handle<Object> value, | 2815 Handle<Name> name, Handle<Object> value, |
2815 StrictMode strict_mode, | 2816 StrictMode strict_mode, |
(...skipping 1113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3929 | 3930 |
3930 return AddDataProperty(&it, value, attributes, STRICT, | 3931 return AddDataProperty(&it, value, attributes, STRICT, |
3931 CERTAINLY_NOT_STORE_FROM_KEYED); | 3932 CERTAINLY_NOT_STORE_FROM_KEYED); |
3932 } | 3933 } |
3933 | 3934 |
3934 | 3935 |
3935 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 3936 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
3936 Handle<JSObject> holder, | 3937 Handle<JSObject> holder, |
3937 Handle<Object> receiver, | 3938 Handle<Object> receiver, |
3938 Handle<Name> name) { | 3939 Handle<Name> name) { |
3939 // TODO(rossberg): Support symbols in the API. | |
3940 if (name->IsSymbol()) return maybe(ABSENT); | |
3941 | |
3942 Isolate* isolate = holder->GetIsolate(); | 3940 Isolate* isolate = holder->GetIsolate(); |
3943 HandleScope scope(isolate); | 3941 HandleScope scope(isolate); |
3944 | 3942 |
3945 // Make sure that the top context does not change when doing | 3943 // Make sure that the top context does not change when doing |
3946 // callbacks or interceptor calls. | 3944 // callbacks or interceptor calls. |
3947 AssertNoContextChange ncc(isolate); | 3945 AssertNoContextChange ncc(isolate); |
3948 | 3946 |
3949 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 3947 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 3948 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 3949 return maybe(ABSENT); |
| 3950 } |
3950 PropertyCallbackArguments args( | 3951 PropertyCallbackArguments args( |
3951 isolate, interceptor->data(), *receiver, *holder); | 3952 isolate, interceptor->data(), *receiver, *holder); |
3952 if (!interceptor->query()->IsUndefined()) { | 3953 if (!interceptor->query()->IsUndefined()) { |
3953 v8::NamedPropertyQueryCallback query = | 3954 v8::GenericNamedPropertyQueryCallback query = |
3954 v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); | 3955 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| 3956 interceptor->query()); |
3955 LOG(isolate, | 3957 LOG(isolate, |
3956 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); | 3958 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
3957 v8::Handle<v8::Integer> result = | 3959 v8::Handle<v8::Integer> result = |
3958 args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); | 3960 args.Call(query, v8::Utils::ToLocal(name)); |
3959 if (!result.IsEmpty()) { | 3961 if (!result.IsEmpty()) { |
3960 DCHECK(result->IsInt32()); | 3962 DCHECK(result->IsInt32()); |
3961 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); | 3963 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
3962 } | 3964 } |
3963 } else if (!interceptor->getter()->IsUndefined()) { | 3965 } else if (!interceptor->getter()->IsUndefined()) { |
3964 v8::NamedPropertyGetterCallback getter = | 3966 v8::GenericNamedPropertyGetterCallback getter = |
3965 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 3967 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 3968 interceptor->getter()); |
3966 LOG(isolate, | 3969 LOG(isolate, |
3967 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); | 3970 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
3968 v8::Handle<v8::Value> result = | 3971 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
3969 args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
3970 if (!result.IsEmpty()) return maybe(DONT_ENUM); | 3972 if (!result.IsEmpty()) return maybe(DONT_ENUM); |
3971 } | 3973 } |
3972 | 3974 |
3973 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); | 3975 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); |
3974 return maybe(ABSENT); | 3976 return maybe(ABSENT); |
3975 } | 3977 } |
3976 | 3978 |
3977 | 3979 |
3978 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( | 3980 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( |
3979 Handle<JSReceiver> object, Handle<Name> name) { | 3981 Handle<JSReceiver> object, Handle<Name> name) { |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4767 Handle<Name> name = isolate->factory()->hidden_string(); | 4769 Handle<Name> name = isolate->factory()->hidden_string(); |
4768 SetOwnPropertyIgnoreAttributes(object, name, value, DONT_ENUM).Assert(); | 4770 SetOwnPropertyIgnoreAttributes(object, name, value, DONT_ENUM).Assert(); |
4769 return object; | 4771 return object; |
4770 } | 4772 } |
4771 | 4773 |
4772 | 4774 |
4773 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( | 4775 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
4774 Handle<JSObject> holder, Handle<JSObject> receiver, Handle<Name> name) { | 4776 Handle<JSObject> holder, Handle<JSObject> receiver, Handle<Name> name) { |
4775 Isolate* isolate = holder->GetIsolate(); | 4777 Isolate* isolate = holder->GetIsolate(); |
4776 | 4778 |
4777 // TODO(rossberg): Support symbols in the API. | 4779 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
4778 if (name->IsSymbol()) return MaybeHandle<Object>(); | 4780 if (interceptor->deleter()->IsUndefined() || |
| 4781 (name->IsSymbol() && !interceptor->can_intercept_symbols())) { |
| 4782 return MaybeHandle<Object>(); |
| 4783 } |
4779 | 4784 |
4780 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 4785 v8::GenericNamedPropertyDeleterCallback deleter = |
4781 if (interceptor->deleter()->IsUndefined()) return MaybeHandle<Object>(); | 4786 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( |
4782 | 4787 interceptor->deleter()); |
4783 v8::NamedPropertyDeleterCallback deleter = | |
4784 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); | |
4785 LOG(isolate, | 4788 LOG(isolate, |
4786 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); | 4789 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); |
4787 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, | 4790 PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
4788 *holder); | 4791 *holder); |
4789 v8::Handle<v8::Boolean> result = | 4792 v8::Handle<v8::Boolean> result = args.Call(deleter, v8::Utils::ToLocal(name)); |
4790 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
4791 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 4793 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
4792 if (result.IsEmpty()) return MaybeHandle<Object>(); | 4794 if (result.IsEmpty()) return MaybeHandle<Object>(); |
4793 | 4795 |
4794 DCHECK(result->IsBoolean()); | 4796 DCHECK(result->IsBoolean()); |
4795 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4797 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
4796 result_internal->VerifyApiCallResultType(); | 4798 result_internal->VerifyApiCallResultType(); |
4797 // Rebox CustomArguments::kReturnValueOffset before returning. | 4799 // Rebox CustomArguments::kReturnValueOffset before returning. |
4798 return handle(*result_internal, isolate); | 4800 return handle(*result_internal, isolate); |
4799 } | 4801 } |
4800 | 4802 |
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5886 !current->HasNamedInterceptor() && | 5888 !current->HasNamedInterceptor() && |
5887 !current->HasIndexedInterceptor()); | 5889 !current->HasIndexedInterceptor()); |
5888 // Compute the property keys and cache them if possible. | 5890 // Compute the property keys and cache them if possible. |
5889 ASSIGN_RETURN_ON_EXCEPTION( | 5891 ASSIGN_RETURN_ON_EXCEPTION( |
5890 isolate, content, | 5892 isolate, content, |
5891 FixedArray::UnionOfKeys( | 5893 FixedArray::UnionOfKeys( |
5892 content, GetEnumPropertyKeys(current, cache_enum_keys)), | 5894 content, GetEnumPropertyKeys(current, cache_enum_keys)), |
5893 FixedArray); | 5895 FixedArray); |
5894 DCHECK(ContainsOnlyValidKeys(content)); | 5896 DCHECK(ContainsOnlyValidKeys(content)); |
5895 | 5897 |
5896 // Add the property keys from the interceptor. | 5898 // Add the non-symbol property keys from the interceptor. |
5897 if (current->HasNamedInterceptor()) { | 5899 if (current->HasNamedInterceptor()) { |
5898 Handle<JSObject> result; | 5900 Handle<JSObject> result; |
5899 if (JSObject::GetKeysForNamedInterceptor( | 5901 if (JSObject::GetKeysForNamedInterceptor( |
5900 current, object).ToHandle(&result)) { | 5902 current, object).ToHandle(&result)) { |
5901 ASSIGN_RETURN_ON_EXCEPTION( | 5903 ASSIGN_RETURN_ON_EXCEPTION( |
5902 isolate, content, | 5904 isolate, content, |
5903 FixedArray::AddKeysFromArrayLike(content, result), | 5905 FixedArray::AddKeysFromArrayLike( |
| 5906 content, result, FixedArray::NON_SYMBOL_KEYS), |
5904 FixedArray); | 5907 FixedArray); |
5905 } | 5908 } |
5906 DCHECK(ContainsOnlyValidKeys(content)); | 5909 DCHECK(ContainsOnlyValidKeys(content)); |
5907 } | 5910 } |
5908 | 5911 |
5909 // If we only want own properties we bail out after the first | 5912 // If we only want own properties we bail out after the first |
5910 // iteration. | 5913 // iteration. |
5911 if (type == OWN_ONLY) break; | 5914 if (type == OWN_ONLY) break; |
5912 } | 5915 } |
5913 return content; | 5916 return content; |
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7702 void FixedArray::Shrink(int new_length) { | 7705 void FixedArray::Shrink(int new_length) { |
7703 DCHECK(0 <= new_length && new_length <= length()); | 7706 DCHECK(0 <= new_length && new_length <= length()); |
7704 if (new_length < length()) { | 7707 if (new_length < length()) { |
7705 GetHeap()->RightTrimFixedArray<Heap::FROM_MUTATOR>( | 7708 GetHeap()->RightTrimFixedArray<Heap::FROM_MUTATOR>( |
7706 this, length() - new_length); | 7709 this, length() - new_length); |
7707 } | 7710 } |
7708 } | 7711 } |
7709 | 7712 |
7710 | 7713 |
7711 MaybeHandle<FixedArray> FixedArray::AddKeysFromArrayLike( | 7714 MaybeHandle<FixedArray> FixedArray::AddKeysFromArrayLike( |
7712 Handle<FixedArray> content, | 7715 Handle<FixedArray> content, Handle<JSObject> array, KeyFilter filter) { |
7713 Handle<JSObject> array) { | |
7714 DCHECK(array->IsJSArray() || array->HasSloppyArgumentsElements()); | 7716 DCHECK(array->IsJSArray() || array->HasSloppyArgumentsElements()); |
7715 ElementsAccessor* accessor = array->GetElementsAccessor(); | 7717 ElementsAccessor* accessor = array->GetElementsAccessor(); |
7716 Handle<FixedArray> result; | 7718 Handle<FixedArray> result; |
7717 ASSIGN_RETURN_ON_EXCEPTION( | 7719 ASSIGN_RETURN_ON_EXCEPTION( |
7718 array->GetIsolate(), result, | 7720 array->GetIsolate(), result, |
7719 accessor->AddElementsToFixedArray(array, array, content), | 7721 accessor->AddElementsToFixedArray(array, array, content, filter), |
7720 FixedArray); | 7722 FixedArray); |
7721 | 7723 |
7722 #ifdef ENABLE_SLOW_DCHECKS | 7724 #ifdef ENABLE_SLOW_DCHECKS |
7723 if (FLAG_enable_slow_asserts) { | 7725 if (FLAG_enable_slow_asserts) { |
7724 DisallowHeapAllocation no_allocation; | 7726 DisallowHeapAllocation no_allocation; |
7725 for (int i = 0; i < result->length(); i++) { | 7727 for (int i = 0; i < result->length(); i++) { |
7726 Object* current = result->get(i); | 7728 Object* current = result->get(i); |
7727 DCHECK(current->IsNumber() || current->IsName()); | 7729 DCHECK(current->IsNumber() || current->IsName()); |
7728 } | 7730 } |
7729 } | 7731 } |
7730 #endif | 7732 #endif |
7731 return result; | 7733 return result; |
7732 } | 7734 } |
7733 | 7735 |
7734 | 7736 |
7735 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, | 7737 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, |
7736 Handle<FixedArray> second) { | 7738 Handle<FixedArray> second) { |
7737 ElementsAccessor* accessor = ElementsAccessor::ForArray(second); | 7739 ElementsAccessor* accessor = ElementsAccessor::ForArray(second); |
7738 Handle<FixedArray> result; | 7740 Handle<FixedArray> result; |
7739 ASSIGN_RETURN_ON_EXCEPTION( | 7741 ASSIGN_RETURN_ON_EXCEPTION( |
7740 first->GetIsolate(), result, | 7742 first->GetIsolate(), result, |
7741 accessor->AddElementsToFixedArray( | 7743 accessor->AddElementsToFixedArray( |
7742 Handle<Object>::null(), // receiver | 7744 Handle<Object>::null(), // receiver |
7743 Handle<JSObject>::null(), // holder | 7745 Handle<JSObject>::null(), // holder |
7744 first, | 7746 first, |
7745 Handle<FixedArrayBase>::cast(second)), | 7747 Handle<FixedArrayBase>::cast(second), |
| 7748 ALL_KEYS), |
7746 FixedArray); | 7749 FixedArray); |
7747 | 7750 |
7748 #ifdef ENABLE_SLOW_DCHECKS | 7751 #ifdef ENABLE_SLOW_DCHECKS |
7749 if (FLAG_enable_slow_asserts) { | 7752 if (FLAG_enable_slow_asserts) { |
7750 DisallowHeapAllocation no_allocation; | 7753 DisallowHeapAllocation no_allocation; |
7751 for (int i = 0; i < result->length(); i++) { | 7754 for (int i = 0; i < result->length(); i++) { |
7752 Object* current = result->get(i); | 7755 Object* current = result->get(i); |
7753 DCHECK(current->IsNumber() || current->IsName()); | 7756 DCHECK(current->IsNumber() || current->IsName()); |
7754 } | 7757 } |
7755 } | 7758 } |
(...skipping 5398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13154 return InterceptorInfo::cast(result); | 13157 return InterceptorInfo::cast(result); |
13155 } | 13158 } |
13156 | 13159 |
13157 | 13160 |
13158 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( | 13161 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( |
13159 Handle<JSObject> holder, | 13162 Handle<JSObject> holder, |
13160 Handle<Object> receiver, | 13163 Handle<Object> receiver, |
13161 Handle<Name> name) { | 13164 Handle<Name> name) { |
13162 Isolate* isolate = holder->GetIsolate(); | 13165 Isolate* isolate = holder->GetIsolate(); |
13163 | 13166 |
13164 // TODO(rossberg): Support symbols in the API. | |
13165 if (name->IsSymbol()) return isolate->factory()->undefined_value(); | |
13166 | |
13167 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); | 13167 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); |
13168 Handle<String> name_string = Handle<String>::cast(name); | |
13169 | |
13170 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); | 13168 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); |
13171 | 13169 |
13172 v8::NamedPropertyGetterCallback getter = | 13170 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
13173 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 13171 return MaybeHandle<Object>(); |
| 13172 } |
| 13173 |
| 13174 v8::GenericNamedPropertyGetterCallback getter = |
| 13175 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 13176 interceptor->getter()); |
13174 LOG(isolate, | 13177 LOG(isolate, |
13175 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 13178 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
13176 PropertyCallbackArguments | 13179 PropertyCallbackArguments |
13177 args(isolate, interceptor->data(), *receiver, *holder); | 13180 args(isolate, interceptor->data(), *receiver, *holder); |
13178 v8::Handle<v8::Value> result = | 13181 v8::Handle<v8::Value> result = |
13179 args.Call(getter, v8::Utils::ToLocal(name_string)); | 13182 args.Call(getter, v8::Utils::ToLocal(name)); |
13180 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 13183 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
13181 if (result.IsEmpty()) return MaybeHandle<Object>(); | 13184 if (result.IsEmpty()) return MaybeHandle<Object>(); |
13182 | 13185 |
13183 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 13186 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
13184 result_internal->VerifyApiCallResultType(); | 13187 result_internal->VerifyApiCallResultType(); |
13185 // Rebox handle before return | 13188 // Rebox handle before return |
13186 return handle(*result_internal, isolate); | 13189 return handle(*result_internal, isolate); |
13187 } | 13190 } |
13188 | 13191 |
13189 | 13192 |
13190 // Compute the property keys from the interceptor. | 13193 // Compute the property keys from the interceptor. |
13191 // TODO(rossberg): support symbols in API, and filter here if needed. | |
13192 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( | 13194 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
13193 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 13195 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
13194 Isolate* isolate = receiver->GetIsolate(); | 13196 Isolate* isolate = receiver->GetIsolate(); |
13195 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 13197 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
13196 PropertyCallbackArguments | 13198 PropertyCallbackArguments |
13197 args(isolate, interceptor->data(), *receiver, *object); | 13199 args(isolate, interceptor->data(), *receiver, *object); |
13198 v8::Handle<v8::Object> result; | 13200 v8::Handle<v8::Object> result; |
13199 if (!interceptor->enumerator()->IsUndefined()) { | 13201 if (!interceptor->enumerator()->IsUndefined()) { |
13200 v8::NamedPropertyEnumeratorCallback enum_fun = | 13202 v8::GenericNamedPropertyEnumeratorCallback enum_fun = |
13201 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( | 13203 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( |
13202 interceptor->enumerator()); | 13204 interceptor->enumerator()); |
13203 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 13205 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
13204 result = args.Call(enum_fun); | 13206 result = args.Call(enum_fun); |
13205 } | 13207 } |
13206 if (result.IsEmpty()) return MaybeHandle<JSObject>(); | 13208 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
13207 #if ENABLE_EXTRA_CHECKS | 13209 #if ENABLE_EXTRA_CHECKS |
13208 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || | 13210 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
13209 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); | 13211 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
13210 #endif | 13212 #endif |
13211 // Rebox before returning. | 13213 // Rebox before returning. |
(...skipping 3216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16428 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16430 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16429 static const char* error_messages_[] = { | 16431 static const char* error_messages_[] = { |
16430 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16432 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16431 }; | 16433 }; |
16432 #undef ERROR_MESSAGES_TEXTS | 16434 #undef ERROR_MESSAGES_TEXTS |
16433 return error_messages_[reason]; | 16435 return error_messages_[reason]; |
16434 } | 16436 } |
16435 | 16437 |
16436 | 16438 |
16437 } } // namespace v8::internal | 16439 } } // namespace v8::internal |
OLD | NEW |