From ebba43f37adc151b1b72f0760d6fc25989408d7d Mon Sep 17 00:00:00 2001 From: "antonm@chromium.org" Date: Fri, 28 May 2010 11:54:58 +0000 Subject: [PATCH] Make intercepted properties retrievable only by getter to be not enumerable. Currently if there is no query callback, V8 finds out intercepted properties' attributes using getter: if getter returns not empty handle V8 treats such a property as property with NONE attribues which means this property is enumerable. However, if there is no enumerator, this property cannot be enumerated. Thus I think we should treat such properties as not enumerable. Drawback of this approach is now one has to implement both query and enumerator callbacks to implement enumerable intercepted properties. BUG=725 Review URL: http://codereview.chromium.org/2270005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4751 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 2 +- test/cctest/test-api.cc | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/objects.cc b/src/objects.cc index e5e1a4e..e2c5bc9 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -2037,7 +2037,7 @@ PropertyAttributes JSObject::GetPropertyAttributeWithInterceptor( VMState state(EXTERNAL); result = getter(v8::Utils::ToLocal(name_handle), info); } - if (!result.IsEmpty()) return NONE; + if (!result.IsEmpty()) return DONT_ENUM; } return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, *name_handle, diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 6254eaa..a33eb94 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -7228,6 +7228,18 @@ THREADED_TEST(NullIndexedInterceptor) { } +THREADED_TEST(NamedPropertyHandlerGetterAttributes) { + v8::HandleScope scope; + v8::Handle templ = v8::FunctionTemplate::New(); + templ->InstanceTemplate()->SetNamedPropertyHandler(InterceptorLoadXICGetter); + LocalContext env; + env->Global()->Set(v8_str("obj"), + templ->GetFunction()->NewInstance()); + ExpectTrue("obj.x === 42"); + ExpectTrue("!obj.propertyIsEnumerable('x')"); +} + + static v8::Handle ParentGetter(Local name, const AccessorInfo& info) { ApiTestFuzzer::Fuzz(); -- 2.7.4