| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index c15038ee9ecc3f13c63ae159a2bea5af453c3262..2c5e2c2ede0fb48196f6f9ff4c470ddcee73a9e3 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -460,22 +460,30 @@ RUNTIME_FUNCTION(StoreCallbackProperty) {
|
| JSObject* holder = JSObject::cast(args[1]);
|
| ExecutableAccessorInfo* callback = ExecutableAccessorInfo::cast(args[2]);
|
| Address setter_address = v8::ToCData<Address>(callback->setter());
|
| - v8::AccessorSetterCallback fun =
|
| - FUNCTION_CAST<v8::AccessorSetterCallback>(setter_address);
|
| - ASSERT(fun != NULL);
|
| - ASSERT(callback->IsCompatibleReceiver(receiver));
|
| Handle<Name> name = args.at<Name>(3);
|
| Handle<Object> value = args.at<Object>(4);
|
| HandleScope scope(isolate);
|
|
|
| - // TODO(rossberg): Support symbols in the API.
|
| - if (name->IsSymbol()) return *value;
|
| - Handle<String> str = Handle<String>::cast(name);
|
| -
|
| LOG(isolate, ApiNamedPropertyAccess("store", receiver, *name));
|
| + ASSERT(callback->IsCompatibleReceiver(receiver));
|
| +
|
| PropertyCallbackArguments
|
| custom_args(isolate, callback->data(), receiver, holder);
|
| - custom_args.Call(fun, v8::Utils::ToLocal(str), v8::Utils::ToLocal(value));
|
| +
|
| + if (name->IsSymbol()) {
|
| + v8::AccessorSymbolSetterCallback fun =
|
| + FUNCTION_CAST<v8::AccessorSymbolSetterCallback>(setter_address);
|
| + Handle<Symbol> sym = Handle<Symbol>::cast(name);
|
| + ASSERT(fun != NULL);
|
| + custom_args.Call(fun, v8::Utils::ToLocal(sym), v8::Utils::ToLocal(value));
|
| + } else {
|
| + v8::AccessorSetterCallback fun =
|
| + FUNCTION_CAST<v8::AccessorSetterCallback>(setter_address);
|
| + ASSERT(fun != NULL);
|
| + Handle<String> str = Handle<String>::cast(name);
|
| + custom_args.Call(fun, v8::Utils::ToLocal(str), v8::Utils::ToLocal(value));
|
| + }
|
| +
|
| RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
|
| return *value;
|
| }
|
| @@ -490,19 +498,17 @@ RUNTIME_FUNCTION(StoreCallbackProperty) {
|
| */
|
| RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly) {
|
| ASSERT(args.length() == StubCache::kInterceptorArgsLength);
|
| - Handle<Name> name_handle =
|
| + Handle<Name> name =
|
| args.at<Name>(StubCache::kInterceptorArgsNameIndex);
|
| Handle<InterceptorInfo> interceptor_info =
|
| args.at<InterceptorInfo>(StubCache::kInterceptorArgsInfoIndex);
|
|
|
| - // TODO(rossberg): Support symbols in the API.
|
| - if (name_handle->IsSymbol())
|
| + if (name->IsSymbol() && !interceptor_info->can_intercept_symbols())
|
| return isolate->heap()->no_interceptor_result_sentinel();
|
| - Handle<String> name = Handle<String>::cast(name_handle);
|
|
|
| Address getter_address = v8::ToCData<Address>(interceptor_info->getter());
|
| - v8::NamedPropertyGetterCallback getter =
|
| - FUNCTION_CAST<v8::NamedPropertyGetterCallback>(getter_address);
|
| + v8::GenericNamedPropertyGetterCallback getter =
|
| + FUNCTION_CAST<v8::GenericNamedPropertyGetterCallback>(getter_address);
|
| ASSERT(getter != NULL);
|
|
|
| Handle<JSObject> receiver =
|
|
|