| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 06c4a4b7563ceff3d06f97e932704fc326c26bf5..4181ba37dd90c8fe1d4e98f86c721604ba980e32 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -417,9 +417,6 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver,
|
| ARRAY_SIZE(args)));
|
| return isolate->Throw<Object>(error);
|
| }
|
| - // TODO(rossberg): Handling symbols in the API requires changing the API,
|
| - // so we do not support it for now.
|
| - if (name->IsSymbol()) return isolate->factory()->undefined_value();
|
| if (structure->IsDeclaredAccessorInfo()) {
|
| return GetDeclaredAccessorProperty(
|
| receiver,
|
| @@ -429,15 +426,24 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver,
|
|
|
| Handle<ExecutableAccessorInfo> data =
|
| Handle<ExecutableAccessorInfo>::cast(structure);
|
| - v8::AccessorGetterCallback call_fun =
|
| - v8::ToCData<v8::AccessorGetterCallback>(data->getter());
|
| - if (call_fun == NULL) return isolate->factory()->undefined_value();
|
| -
|
| - Handle<String> key = Handle<String>::cast(name);
|
| LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name));
|
| PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
|
| - v8::Handle<v8::Value> result =
|
| - args.Call(call_fun, v8::Utils::ToLocal(key));
|
| +
|
| + v8::Handle<v8::Value> result;
|
| + if (name->IsSymbol()) {
|
| + v8::AccessorSymbolGetterCallback call_fun =
|
| + v8::ToCData<v8::AccessorSymbolGetterCallback>(data->getter());
|
| + if (call_fun == NULL) return isolate->factory()->undefined_value();
|
| + result =
|
| + args.Call(call_fun, v8::Utils::ToLocal(Handle<Symbol>::cast(name)));
|
| + } else {
|
| + v8::AccessorGetterCallback call_fun =
|
| + v8::ToCData<v8::AccessorGetterCallback>(data->getter());
|
| + if (call_fun == NULL) return isolate->factory()->undefined_value();
|
| + result =
|
| + args.Call(call_fun, v8::Utils::ToLocal(Handle<String>::cast(name)));
|
| + }
|
| +
|
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| if (result.IsEmpty()) {
|
| return isolate->factory()->undefined_value();
|
| @@ -484,18 +490,25 @@ MaybeHandle<Object> Object::SetPropertyWithCallback(Handle<Object> receiver,
|
| ARRAY_SIZE(args)));
|
| return isolate->Throw<Object>(error);
|
| }
|
| - // TODO(rossberg): Support symbols in the API.
|
| - if (name->IsSymbol()) return value;
|
| Object* call_obj = data->setter();
|
| - v8::AccessorSetterCallback call_fun =
|
| - v8::ToCData<v8::AccessorSetterCallback>(call_obj);
|
| - if (call_fun == NULL) return value;
|
| - Handle<String> key = Handle<String>::cast(name);
|
| LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name));
|
| PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
|
| - args.Call(call_fun,
|
| - v8::Utils::ToLocal(key),
|
| - v8::Utils::ToLocal(value));
|
| + if (name->IsSymbol()) {
|
| + v8::AccessorSymbolSetterCallback call_fun =
|
| + v8::ToCData<v8::AccessorSymbolSetterCallback>(call_obj);
|
| + if (call_fun == NULL) return value;
|
| + args.Call(call_fun,
|
| + v8::Utils::ToLocal(Handle<Symbol>::cast(name)),
|
| + v8::Utils::ToLocal(value));
|
| + } else {
|
| + v8::AccessorSetterCallback call_fun =
|
| + v8::ToCData<v8::AccessorSetterCallback>(call_obj);
|
| + if (call_fun == NULL) return value;
|
| + args.Call(call_fun,
|
| + v8::Utils::ToLocal(Handle<String>::cast(name)),
|
| + v8::Utils::ToLocal(value));
|
| + }
|
| +
|
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| return value;
|
| }
|
| @@ -2926,22 +2939,21 @@ MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(
|
| Handle<Object> value,
|
| PropertyAttributes attributes,
|
| StrictMode strict_mode) {
|
| - // TODO(rossberg): Support symbols in the API.
|
| - if (name->IsSymbol()) return value;
|
| Isolate* isolate = object->GetIsolate();
|
| - Handle<String> name_string = Handle<String>::cast(name);
|
| Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
|
| - if (!interceptor->setter()->IsUndefined()) {
|
| + if (!interceptor->setter()->IsUndefined()
|
| + && (name->IsString() || interceptor->can_intercept_symbols())) {
|
| LOG(isolate,
|
| ApiNamedPropertyAccess("interceptor-named-set", *object, *name));
|
| PropertyCallbackArguments args(
|
| isolate, interceptor->data(), *object, *object);
|
| - v8::NamedPropertySetterCallback setter =
|
| - v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter());
|
| + v8::GenericNamedPropertySetterCallback setter =
|
| + v8::ToCData<v8::GenericNamedPropertySetterCallback>(
|
| + interceptor->setter());
|
| Handle<Object> value_unhole = value->IsTheHole()
|
| ? Handle<Object>(isolate->factory()->undefined_value()) : value;
|
| v8::Handle<v8::Value> result = args.Call(setter,
|
| - v8::Utils::ToLocal(name_string),
|
| + v8::Utils::ToLocal(name),
|
| v8::Utils::ToLocal(value_unhole));
|
| RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| if (!result.IsEmpty()) return value;
|
| @@ -4319,9 +4331,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<PropertyAttributes>(ABSENT);
|
| -
|
| Isolate* isolate = holder->GetIsolate();
|
| HandleScope scope(isolate);
|
|
|
| @@ -4330,27 +4339,32 @@ 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()) {
|
| ASSERT(result->IsInt32());
|
| return Maybe<PropertyAttributes>(
|
| 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)));
|
| + args.Call(getter, v8::Utils::ToLocal(name));
|
| if (!result.IsEmpty()) return Maybe<PropertyAttributes>(DONT_ENUM);
|
| }
|
| return Maybe<PropertyAttributes>();
|
| @@ -5183,19 +5197,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()) {
|
| ASSERT(result->IsBoolean());
|
| @@ -13565,22 +13578,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>();
|
|
|
| @@ -13592,7 +13605,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();
|
| @@ -13601,8 +13613,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);
|
|
|