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); |