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

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: 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
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 2889 matching lines...) Expand 10 before | Expand all | Expand 10 after
2900 UNREACHABLE(); 2900 UNREACHABLE();
2901 } 2901 }
2902 } 2902 }
2903 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); 2903 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>();
2904 return handle(new_map); 2904 return handle(new_map);
2905 } 2905 }
2906 2906
2907 2907
2908 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, 2908 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it,
2909 Handle<Object> value) { 2909 Handle<Object> value) {
2910 // TODO(rossberg): Support symbols in the API. 2910 Handle<Name> name = it->name();
2911 if (it->name()->IsSymbol()) return value;
2912
2913 Handle<String> name_string = Handle<String>::cast(it->name());
2914 Handle<JSObject> holder = it->GetHolder<JSObject>(); 2911 Handle<JSObject> holder = it->GetHolder<JSObject>();
2915 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); 2912 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor());
2916 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); 2913 if (interceptor->setter()->IsUndefined() ||
2914 (!name->IsString() && !interceptor->can_intercept_symbols())) {
dcarney 2014/08/13 08:25:40 everywhere else you do name->IsSymbol() && !inte
wingo 2014/08/13 10:45:39 Done.
2915 return MaybeHandle<Object>();
2916 }
2917 2917
2918 LOG(it->isolate(), 2918 LOG(it->isolate(),
2919 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name_string)); 2919 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name));
2920 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, 2920 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder,
2921 *holder); 2921 *holder);
2922 v8::NamedPropertySetterCallback setter = 2922 v8::GenericNamedPropertySetterCallback setter =
2923 v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); 2923 v8::ToCData<v8::GenericNamedPropertySetterCallback>(
2924 interceptor->setter());
2924 v8::Handle<v8::Value> result = args.Call( 2925 v8::Handle<v8::Value> result = args.Call(
2925 setter, v8::Utils::ToLocal(name_string), v8::Utils::ToLocal(value)); 2926 setter, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value));
2926 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 2927 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
2927 if (!result.IsEmpty()) return value; 2928 if (!result.IsEmpty()) return value;
2928 2929
2929 return MaybeHandle<Object>(); 2930 return MaybeHandle<Object>();
2930 } 2931 }
2931 2932
2932 2933
2933 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, 2934 MaybeHandle<Object> Object::SetProperty(Handle<Object> object,
2934 Handle<Name> name, Handle<Object> value, 2935 Handle<Name> name, Handle<Object> value,
2935 StrictMode strict_mode, 2936 StrictMode strict_mode,
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after
4238 } 4239 }
4239 4240
4240 return value; 4241 return value;
4241 } 4242 }
4242 4243
4243 4244
4244 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( 4245 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor(
4245 Handle<JSObject> holder, 4246 Handle<JSObject> holder,
4246 Handle<Object> receiver, 4247 Handle<Object> receiver,
4247 Handle<Name> name) { 4248 Handle<Name> name) {
4248 // TODO(rossberg): Support symbols in the API.
4249 if (name->IsSymbol()) return maybe(ABSENT);
4250
4251 Isolate* isolate = holder->GetIsolate(); 4249 Isolate* isolate = holder->GetIsolate();
4252 HandleScope scope(isolate); 4250 HandleScope scope(isolate);
4253 4251
4254 // Make sure that the top context does not change when doing 4252 // Make sure that the top context does not change when doing
4255 // callbacks or interceptor calls. 4253 // callbacks or interceptor calls.
4256 AssertNoContextChange ncc(isolate); 4254 AssertNoContextChange ncc(isolate);
4257 4255
4258 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); 4256 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor());
4257 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
4258 return Maybe<PropertyAttributes>(ABSENT);
4259 }
4259 PropertyCallbackArguments args( 4260 PropertyCallbackArguments args(
4260 isolate, interceptor->data(), *receiver, *holder); 4261 isolate, interceptor->data(), *receiver, *holder);
4261 if (!interceptor->query()->IsUndefined()) { 4262 if (!interceptor->query()->IsUndefined()) {
4262 v8::NamedPropertyQueryCallback query = 4263 v8::GenericNamedPropertyQueryCallback query =
4263 v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); 4264 v8::ToCData<v8::GenericNamedPropertyQueryCallback>(
4265 interceptor->query());
4264 LOG(isolate, 4266 LOG(isolate,
4265 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); 4267 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name));
4266 v8::Handle<v8::Integer> result = 4268 v8::Handle<v8::Integer> result =
4267 args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); 4269 args.Call(query, v8::Utils::ToLocal(name));
4268 if (!result.IsEmpty()) { 4270 if (!result.IsEmpty()) {
4269 DCHECK(result->IsInt32()); 4271 DCHECK(result->IsInt32());
4270 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); 4272 return maybe(static_cast<PropertyAttributes>(result->Int32Value()));
4271 } 4273 }
4272 } else if (!interceptor->getter()->IsUndefined()) { 4274 } else if (!interceptor->getter()->IsUndefined()) {
4273 v8::NamedPropertyGetterCallback getter = 4275 v8::GenericNamedPropertyGetterCallback getter =
4274 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); 4276 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
4277 interceptor->getter());
4275 LOG(isolate, 4278 LOG(isolate,
4276 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); 4279 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name));
4277 v8::Handle<v8::Value> result = 4280 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name));
4278 args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name)));
4279 if (!result.IsEmpty()) return maybe(DONT_ENUM); 4281 if (!result.IsEmpty()) return maybe(DONT_ENUM);
4280 } 4282 }
4281 4283
4282 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); 4284 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>());
4283 return maybe(ABSENT); 4285 return maybe(ABSENT);
4284 } 4286 }
4285 4287
4286 4288
4287 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( 4289 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
4288 Handle<JSReceiver> object, Handle<Name> name) { 4290 Handle<JSReceiver> object, Handle<Name> name) {
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after
5123 Handle<Object> result = DeleteNormalizedProperty(object, name, delete_mode); 5125 Handle<Object> result = DeleteNormalizedProperty(object, name, delete_mode);
5124 ReoptimizeIfPrototype(object); 5126 ReoptimizeIfPrototype(object);
5125 return result; 5127 return result;
5126 } 5128 }
5127 5129
5128 5130
5129 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( 5131 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor(
5130 Handle<JSObject> object, Handle<Name> name) { 5132 Handle<JSObject> object, Handle<Name> name) {
5131 Isolate* isolate = object->GetIsolate(); 5133 Isolate* isolate = object->GetIsolate();
5132 5134
5133 // TODO(rossberg): Support symbols in the API.
5134 if (name->IsSymbol()) return isolate->factory()->false_value();
5135
5136 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 5135 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
5137 if (!interceptor->deleter()->IsUndefined()) { 5136 if (!interceptor->deleter()->IsUndefined()
5138 v8::NamedPropertyDeleterCallback deleter = 5137 && (name->IsString() || interceptor->can_intercept_symbols())) {
5139 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); 5138 v8::GenericNamedPropertyDeleterCallback deleter =
5139 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>(
5140 interceptor->deleter());
5140 LOG(isolate, 5141 LOG(isolate,
5141 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); 5142 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name));
5142 PropertyCallbackArguments args( 5143 PropertyCallbackArguments args(
5143 isolate, interceptor->data(), *object, *object); 5144 isolate, interceptor->data(), *object, *object);
5144 v8::Handle<v8::Boolean> result = 5145 v8::Handle<v8::Boolean> result =
5145 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); 5146 args.Call(deleter, v8::Utils::ToLocal(name));
5146 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 5147 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
5147 if (!result.IsEmpty()) { 5148 if (!result.IsEmpty()) {
5148 DCHECK(result->IsBoolean()); 5149 DCHECK(result->IsBoolean());
5149 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 5150 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
5150 result_internal->VerifyApiCallResultType(); 5151 result_internal->VerifyApiCallResultType();
5151 // Rebox CustomArguments::kReturnValueOffset before returning. 5152 // Rebox CustomArguments::kReturnValueOffset before returning.
5152 return handle(*result_internal, isolate); 5153 return handle(*result_internal, isolate);
5153 } 5154 }
5154 } 5155 }
5155 Handle<Object> result = 5156 Handle<Object> result =
(...skipping 8419 matching lines...) Expand 10 before | Expand all | Expand 10 after
13575 return InterceptorInfo::cast(result); 13576 return InterceptorInfo::cast(result);
13576 } 13577 }
13577 13578
13578 13579
13579 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( 13580 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(
13580 Handle<JSObject> holder, 13581 Handle<JSObject> holder,
13581 Handle<Object> receiver, 13582 Handle<Object> receiver,
13582 Handle<Name> name) { 13583 Handle<Name> name) {
13583 Isolate* isolate = holder->GetIsolate(); 13584 Isolate* isolate = holder->GetIsolate();
13584 13585
13585 // TODO(rossberg): Support symbols in the API.
13586 if (name->IsSymbol()) return isolate->factory()->undefined_value();
13587
13588 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); 13586 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate);
13589 Handle<String> name_string = Handle<String>::cast(name);
13590
13591 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); 13587 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>();
13592 13588
13593 v8::NamedPropertyGetterCallback getter = 13589 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
13594 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); 13590 return MaybeHandle<Object>();
13591 }
13592
13593 v8::GenericNamedPropertyGetterCallback getter =
13594 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
13595 interceptor->getter());
13595 LOG(isolate, 13596 LOG(isolate,
13596 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); 13597 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name));
13597 PropertyCallbackArguments 13598 PropertyCallbackArguments
13598 args(isolate, interceptor->data(), *receiver, *holder); 13599 args(isolate, interceptor->data(), *receiver, *holder);
13599 v8::Handle<v8::Value> result = 13600 v8::Handle<v8::Value> result =
13600 args.Call(getter, v8::Utils::ToLocal(name_string)); 13601 args.Call(getter, v8::Utils::ToLocal(name));
13601 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 13602 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
13602 if (result.IsEmpty()) return MaybeHandle<Object>(); 13603 if (result.IsEmpty()) return MaybeHandle<Object>();
13603 13604
13604 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 13605 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
13605 result_internal->VerifyApiCallResultType(); 13606 result_internal->VerifyApiCallResultType();
13606 // Rebox handle before return 13607 // Rebox handle before return
13607 return handle(*result_internal, isolate); 13608 return handle(*result_internal, isolate);
13608 } 13609 }
13609 13610
13610 13611
13611 // Compute the property keys from the interceptor. 13612 // Compute the property keys from the interceptor.
13612 // TODO(rossberg): support symbols in API, and filter here if needed.
13613 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( 13613 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor(
13614 Handle<JSObject> object, Handle<JSReceiver> receiver) { 13614 Handle<JSObject> object, Handle<JSReceiver> receiver) {
13615 Isolate* isolate = receiver->GetIsolate(); 13615 Isolate* isolate = receiver->GetIsolate();
13616 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 13616 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
13617 PropertyCallbackArguments 13617 PropertyCallbackArguments
13618 args(isolate, interceptor->data(), *receiver, *object); 13618 args(isolate, interceptor->data(), *receiver, *object);
13619 v8::Handle<v8::Object> result; 13619 v8::Handle<v8::Object> result;
13620 if (!interceptor->enumerator()->IsUndefined()) { 13620 if (!interceptor->enumerator()->IsUndefined()) {
13621 v8::NamedPropertyEnumeratorCallback enum_fun = 13621 v8::GenericNamedPropertyEnumeratorCallback enum_fun =
13622 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( 13622 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>(
13623 interceptor->enumerator()); 13623 interceptor->enumerator());
13624 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); 13624 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
13625 result = args.Call(enum_fun); 13625 result = args.Call(enum_fun);
13626 } 13626 }
13627 if (result.IsEmpty()) return MaybeHandle<JSObject>(); 13627 if (result.IsEmpty()) return MaybeHandle<JSObject>();
13628 #if ENABLE_EXTRA_CHECKS 13628 #if ENABLE_EXTRA_CHECKS
13629 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || 13629 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
13630 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); 13630 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements());
13631 #endif 13631 #endif
13632 // Rebox before returning. 13632 // Rebox before returning.
(...skipping 3280 matching lines...) Expand 10 before | Expand all | Expand 10 after
16913 #define ERROR_MESSAGES_TEXTS(C, T) T, 16913 #define ERROR_MESSAGES_TEXTS(C, T) T,
16914 static const char* error_messages_[] = { 16914 static const char* error_messages_[] = {
16915 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16915 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16916 }; 16916 };
16917 #undef ERROR_MESSAGES_TEXTS 16917 #undef ERROR_MESSAGES_TEXTS
16918 return error_messages_[reason]; 16918 return error_messages_[reason];
16919 } 16919 }
16920 16920
16921 16921
16922 } } // namespace v8::internal 16922 } } // namespace v8::internal
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698