Commit 8896e45d authored by yurys@chromium.org's avatar yurys@chromium.org

Object.getOwnPropertyNames should be free of duplicates

BUG=41243
Review URL: http://codereview.chromium.org/2825026

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4958 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5751d8f5
......@@ -677,9 +677,17 @@ function ObjectGetOwnPropertyNames(obj) {
}
}
// Property names are expected to be strings.
for (var i = 0; i < propertyNames.length; ++i)
propertyNames[i] = ToString(propertyNames[i]);
// Property names are expected to be unique strings.
var propertySet = {};
var j = 0;
for (var i = 0; i < propertyNames.length; ++i) {
var name = ToString(propertyNames[i]);
if (name in propertySet)
continue;
propertySet[name] = true;
propertyNames[j++] = name;
}
propertyNames.length = j;
return propertyNames;
}
......
......@@ -5035,6 +5035,31 @@ THREADED_TEST(AccessControlGetOwnPropertyNames) {
}
static v8::Handle<v8::Array> NamedPropertyEnumerator(const AccessorInfo& info) {
v8::Handle<v8::Array> result = v8::Array::New(1);
result->Set(0, v8_str("x"));
return result;
}
THREADED_TEST(GetOwnPropertyNamesWithInterceptor) {
v8::HandleScope handle_scope;
v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New();
obj_template->Set(v8_str("x"), v8::Integer::New(42));
obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL,
NamedPropertyEnumerator);
LocalContext context;
v8::Handle<v8::Object> global = context->Global();
global->Set(v8_str("object"), obj_template->NewInstance());
v8::Handle<Value> value =
CompileRun("Object.getOwnPropertyNames(object).join(',')");
CHECK_EQ(v8_str("x"), value);
}
static v8::Handle<Value> ConstTenGetter(Local<String> name,
const AccessorInfo& info) {
return v8_num(10);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment