| Index: src/handles.cc
|
| diff --git a/src/handles.cc b/src/handles.cc
|
| index 700a334923a4e739061c0ea95b08575eeee2071d..7ea494c4c319365363bb6edeef2bfa1304374ef8 100644
|
| --- a/src/handles.cc
|
| +++ b/src/handles.cc
|
| @@ -691,7 +691,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());
|
| @@ -713,7 +713,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());
|
| @@ -744,8 +744,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();
|
| @@ -760,6 +761,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.
|
| @@ -826,11 +837,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);
|
| }
|
|
|
|
|