Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index ed05749f135d3a8e90b9e71d1cf9a5fc56711ac9..15e5f16193b5118281ed1031d855a473735353b3 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -2907,22 +2907,23 @@ MaybeHandle<Map> Map::TryUpdateInternal(Handle<Map> old_map) { |
| MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, |
| Handle<Object> value) { |
| - // TODO(rossberg): Support symbols in the API. |
| - if (it->name()->IsSymbol()) return value; |
| - |
| - Handle<String> name_string = Handle<String>::cast(it->name()); |
| + Handle<Name> name = it->name(); |
| Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| - if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); |
| + if (interceptor->setter()->IsUndefined() || |
| + (!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.
|
| + return MaybeHandle<Object>(); |
| + } |
| LOG(it->isolate(), |
| - ApiNamedPropertyAccess("interceptor-named-set", *holder, *name_string)); |
| + ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); |
| PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, |
| *holder); |
| - v8::NamedPropertySetterCallback setter = |
| - v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); |
| + v8::GenericNamedPropertySetterCallback setter = |
| + v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
| + interceptor->setter()); |
| v8::Handle<v8::Value> result = args.Call( |
| - setter, v8::Utils::ToLocal(name_string), v8::Utils::ToLocal(value)); |
| + setter, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); |
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| if (!result.IsEmpty()) return value; |
| @@ -4245,9 +4246,6 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
| Handle<JSObject> holder, |
| Handle<Object> receiver, |
| Handle<Name> name) { |
| - // TODO(rossberg): Support symbols in the API. |
| - if (name->IsSymbol()) return maybe(ABSENT); |
| - |
| Isolate* isolate = holder->GetIsolate(); |
| HandleScope scope(isolate); |
| @@ -4256,26 +4254,30 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
| AssertNoContextChange ncc(isolate); |
| Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| + if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| + return Maybe<PropertyAttributes>(ABSENT); |
| + } |
| PropertyCallbackArguments args( |
| isolate, interceptor->data(), *receiver, *holder); |
| if (!interceptor->query()->IsUndefined()) { |
| - v8::NamedPropertyQueryCallback query = |
| - v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); |
| + v8::GenericNamedPropertyQueryCallback query = |
| + v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| + interceptor->query()); |
| LOG(isolate, |
| ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| v8::Handle<v8::Integer> result = |
| - args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| + args.Call(query, v8::Utils::ToLocal(name)); |
| if (!result.IsEmpty()) { |
| DCHECK(result->IsInt32()); |
| return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
| } |
| } else if (!interceptor->getter()->IsUndefined()) { |
| - v8::NamedPropertyGetterCallback getter = |
| - v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); |
| + v8::GenericNamedPropertyGetterCallback getter = |
| + v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| + interceptor->getter()); |
| LOG(isolate, |
| ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
| - v8::Handle<v8::Value> result = |
| - args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| + v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
| if (!result.IsEmpty()) return maybe(DONT_ENUM); |
| } |
| @@ -5130,19 +5132,18 @@ MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
| Handle<JSObject> object, Handle<Name> name) { |
| Isolate* isolate = object->GetIsolate(); |
| - // TODO(rossberg): Support symbols in the API. |
| - if (name->IsSymbol()) return isolate->factory()->false_value(); |
| - |
| Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| - if (!interceptor->deleter()->IsUndefined()) { |
| - v8::NamedPropertyDeleterCallback deleter = |
| - v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); |
| + if (!interceptor->deleter()->IsUndefined() |
| + && (name->IsString() || interceptor->can_intercept_symbols())) { |
| + v8::GenericNamedPropertyDeleterCallback deleter = |
| + v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( |
| + interceptor->deleter()); |
| LOG(isolate, |
| ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); |
| PropertyCallbackArguments args( |
| isolate, interceptor->data(), *object, *object); |
| v8::Handle<v8::Boolean> result = |
| - args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| + args.Call(deleter, v8::Utils::ToLocal(name)); |
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| if (!result.IsEmpty()) { |
| DCHECK(result->IsBoolean()); |
| @@ -13582,22 +13583,22 @@ MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( |
| Handle<Name> name) { |
| Isolate* isolate = holder->GetIsolate(); |
| - // TODO(rossberg): Support symbols in the API. |
| - if (name->IsSymbol()) return isolate->factory()->undefined_value(); |
| - |
| Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); |
| - Handle<String> name_string = Handle<String>::cast(name); |
| - |
| if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); |
| - v8::NamedPropertyGetterCallback getter = |
| - v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); |
| + if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| + return MaybeHandle<Object>(); |
| + } |
| + |
| + v8::GenericNamedPropertyGetterCallback getter = |
| + v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| + interceptor->getter()); |
| LOG(isolate, |
| ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
| PropertyCallbackArguments |
| args(isolate, interceptor->data(), *receiver, *holder); |
| v8::Handle<v8::Value> result = |
| - args.Call(getter, v8::Utils::ToLocal(name_string)); |
| + args.Call(getter, v8::Utils::ToLocal(name)); |
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| if (result.IsEmpty()) return MaybeHandle<Object>(); |
| @@ -13609,7 +13610,6 @@ MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( |
| // Compute the property keys from the interceptor. |
| -// TODO(rossberg): support symbols in API, and filter here if needed. |
| MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| Isolate* isolate = receiver->GetIsolate(); |
| @@ -13618,8 +13618,8 @@ MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| args(isolate, interceptor->data(), *receiver, *object); |
| v8::Handle<v8::Object> result; |
| if (!interceptor->enumerator()->IsUndefined()) { |
| - v8::NamedPropertyEnumeratorCallback enum_fun = |
| - v8::ToCData<v8::NamedPropertyEnumeratorCallback>( |
| + v8::GenericNamedPropertyEnumeratorCallback enum_fun = |
| + v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( |
| interceptor->enumerator()); |
| LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
| result = args.Call(enum_fun); |