Index: src/handles.cc |
diff --git a/src/handles.cc b/src/handles.cc |
index 57f5d1b66f685ecf14eac5fda391bb7b0f52d2cd..baaef3d29e7e9619c6946c6303ef74124a20a114 100644 |
--- a/src/handles.cc |
+++ b/src/handles.cc |
@@ -701,7 +701,7 @@ void CustomArguments::IterateInstance(ObjectVisitor* v) { |
// Compute the property keys from the interceptor. |
-v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, |
+v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver, |
Handle<JSObject> object) { |
Isolate* isolate = receiver->GetIsolate(); |
Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
@@ -723,7 +723,7 @@ v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, |
// Compute the element keys from the interceptor. |
-v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSObject> receiver, |
+v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSReceiver> receiver, |
Handle<JSObject> object) { |
Isolate* isolate = receiver->GetIsolate(); |
Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
@@ -754,8 +754,9 @@ static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { |
} |
-Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, |
- KeyCollectionType type) { |
+Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSReceiver> object, |
+ KeyCollectionType type, |
+ bool* threw) { |
USE(ContainsOnlyValidKeys); |
Isolate* isolate = object->GetIsolate(); |
Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); |
@@ -770,6 +771,16 @@ Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, |
for (Handle<Object> p = object; |
*p != isolate->heap()->null_value(); |
p = Handle<Object>(p->GetPrototype(), isolate)) { |
+ if (p->IsJSProxy()) { |
+ Handle<JSProxy> proxy(JSProxy::cast(*p), isolate); |
+ Handle<Object> args[] = { proxy }; |
+ Handle<Object> names = Execution::Call( |
+ isolate->proxy_enumerate(), object, ARRAY_SIZE(args), args, threw); |
+ if (*threw) return content; |
+ content = AddKeysFromJSArray(content, Handle<JSArray>::cast(names)); |
+ break; |
+ } |
+ |
Handle<JSObject> current(JSObject::cast(*p), isolate); |
// Check access rights if required. |
@@ -836,11 +847,11 @@ Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, |
} |
-Handle<JSArray> GetKeysFor(Handle<JSObject> object) { |
+Handle<JSArray> GetKeysFor(Handle<JSReceiver> object, bool* threw) { |
Isolate* isolate = object->GetIsolate(); |
isolate->counters()->for_in()->Increment(); |
- Handle<FixedArray> elements = GetKeysInFixedArrayFor(object, |
- INCLUDE_PROTOS); |
+ Handle<FixedArray> elements = |
+ GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, threw); |
return isolate->factory()->NewJSArrayWithElements(elements); |
} |