Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: src/objects.cc

Issue 467013003: Add interceptor support for symbols (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Updated to filter out non-symbol keys from for-in enumeration Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698