[ES5] Made properties of the arguments array enumerable.

Review URL: http://codereview.chromium.org/200141


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2897 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1b812fb3
...@@ -531,57 +531,49 @@ Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, ...@@ -531,57 +531,49 @@ Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object,
KeyCollectionType type) { KeyCollectionType type) {
Handle<FixedArray> content = Factory::empty_fixed_array(); Handle<FixedArray> content = Factory::empty_fixed_array();
JSObject* arguments_boilerplate =
Top::context()->global_context()->arguments_boilerplate();
JSFunction* arguments_function =
JSFunction::cast(arguments_boilerplate->map()->constructor());
bool allow_enumeration = (object->map()->constructor() != arguments_function);
// Only collect keys if access is permitted. // Only collect keys if access is permitted.
if (allow_enumeration) { for (Handle<Object> p = object;
for (Handle<Object> p = object; *p != Heap::null_value();
*p != Heap::null_value(); p = Handle<Object>(p->GetPrototype())) {
p = Handle<Object>(p->GetPrototype())) { Handle<JSObject> current(JSObject::cast(*p));
Handle<JSObject> current(JSObject::cast(*p));
// Check access rights if required.
// Check access rights if required. if (current->IsAccessCheckNeeded() &&
if (current->IsAccessCheckNeeded() && !Top::MayNamedAccess(*current, Heap::undefined_value(),
!Top::MayNamedAccess(*current, Heap::undefined_value(), v8::ACCESS_KEYS)) {
v8::ACCESS_KEYS)) { Top::ReportFailedAccessCheck(*current, v8::ACCESS_KEYS);
Top::ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); break;
break; }
}
// Compute the element keys.
Handle<FixedArray> element_keys =
Factory::NewFixedArray(current->NumberOfEnumElements());
current->GetEnumElementKeys(*element_keys);
content = UnionOfKeys(content, element_keys);
// Add the element keys from the interceptor.
if (current->HasIndexedInterceptor()) {
v8::Handle<v8::Array> result =
GetKeysForIndexedInterceptor(object, current);
if (!result.IsEmpty())
content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
}
// Compute the property keys. // Compute the element keys.
content = UnionOfKeys(content, GetEnumPropertyKeys(current)); Handle<FixedArray> element_keys =
Factory::NewFixedArray(current->NumberOfEnumElements());
current->GetEnumElementKeys(*element_keys);
content = UnionOfKeys(content, element_keys);
// Add the element keys from the interceptor.
if (current->HasIndexedInterceptor()) {
v8::Handle<v8::Array> result =
GetKeysForIndexedInterceptor(object, current);
if (!result.IsEmpty())
content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
}
// Add the property keys from the interceptor. // Compute the property keys.
if (current->HasNamedInterceptor()) { content = UnionOfKeys(content, GetEnumPropertyKeys(current));
v8::Handle<v8::Array> result =
GetKeysForNamedInterceptor(object, current);
if (!result.IsEmpty())
content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
}
// If we only want local properties we bail out after the first // Add the property keys from the interceptor.
// iteration. if (current->HasNamedInterceptor()) {
if (type == LOCAL_ONLY) v8::Handle<v8::Array> result =
break; GetKeysForNamedInterceptor(object, current);
if (!result.IsEmpty())
content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
} }
// If we only want local properties we bail out after the first
// iteration.
if (type == LOCAL_ONLY)
break;
} }
return content; return content;
} }
......
...@@ -42,11 +42,11 @@ function setArgumentCount() { ...@@ -42,11 +42,11 @@ function setArgumentCount() {
} }
assertEquals(0, countArguments()); assertEquals(0, countArguments());
assertEquals(0, countArguments(1)); assertEquals(1, countArguments(1));
assertEquals(0, countArguments(1, 2)); assertEquals(2, countArguments(1, 2));
assertEquals(0, countArguments(1, 2, 3, 4, 5)); assertEquals(5, countArguments(1, 2, 3, 4, 5));
assertEquals(0, setArgumentCount()); assertEquals(2, setArgumentCount());
assertEquals(0, setArgumentCount(1)); assertEquals(3, setArgumentCount(1));
assertEquals(0, setArgumentCount(1, 2)); assertEquals(4, setArgumentCount(1, 2));
assertEquals(0, setArgumentCount(1, 2, 3, 4, 5)); assertEquals(7, setArgumentCount(1, 2, 3, 4, 5));
...@@ -52,7 +52,7 @@ assertEquals(Object.keys(x), []); ...@@ -52,7 +52,7 @@ assertEquals(Object.keys(x), []);
assertEquals(Object.keys(function () {}), []); assertEquals(Object.keys(function () {}), []);
function argsTest(a, b, c) { function argsTest(a, b, c) {
assertEquals([], Object.keys(arguments)); assertEquals([0, 1, 2], Object.keys(arguments));
} }
argsTest(1, 2, 3); argsTest(1, 2, 3);
......
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