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

Unified Diff: src/stub-cache.cc

Issue 341453003: Support symbol-named properties in API (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects-printer.cc ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 =
« no previous file with comments | « src/objects-printer.cc ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698