Index: src/js/proxy.js |
diff --git a/src/js/proxy.js b/src/js/proxy.js |
index 3885e408add350acff7d74276a48a28f7eb8cb5c..d1202f7066bd2d66170f7518f0b95376fb77807a 100644 |
--- a/src/js/proxy.js |
+++ b/src/js/proxy.js |
@@ -152,31 +152,30 @@ function DerivedKeysTrap() { |
return enumerableNames |
} |
-function DerivedEnumerateTrap() { |
- var names = this.getPropertyNames() |
- var enumerableNames = [] |
- for (var i = 0, count = 0; i < names.length; ++i) { |
- var name = names[i] |
- if (IS_SYMBOL(name)) continue |
- var desc = this.getPropertyDescriptor(TO_STRING(name)) |
- if (!IS_UNDEFINED(desc)) { |
- if (!desc.configurable) { |
- throw MakeTypeError(kProxyPropNotConfigurable, |
- this, name, "getPropertyDescriptor") |
- } |
- if (desc.enumerable) enumerableNames[count++] = names[i] |
- } |
+// Implements part of ES6 9.5.11 Proxy.[[Enumerate]]: |
+// Call the trap, which should return an iterator, exhaust the iterator, |
+// and return an array containing the values. |
+function ProxyEnumerate(trap, handler, target) { |
+ // 7. Let trapResult be ? Call(trap, handler, «target»). |
+ var trap_result = %_Call(trap, handler, target); |
+ // 8. If Type(trapResult) is not Object, throw a TypeError exception. |
+ if (!IS_SPEC_OBJECT(trap_result)) { |
+ throw MakeTypeError(kProxyHandlerReturned, handler, "non-Object", |
+ "enumerate"); |
} |
- return enumerableNames |
-} |
- |
-function ProxyEnumerate(proxy) { |
- var handler = %GetHandler(proxy) |
- if (IS_UNDEFINED(handler.enumerate)) { |
- return %Apply(DerivedEnumerateTrap, handler, [], 0, 0) |
- } else { |
- return ToNameArray(handler.enumerate(), "enumerate", false) |
+ // 9. Return trapResult. |
+ var result = []; |
+ for (var it = trap_result.next(); !it.done; it = trap_result.next()) { |
+ var key = it.value; |
+ // Not yet spec'ed as of 2015-11-25, but will be spec'ed soon: |
+ // If the iterator returns a non-string value, throw a TypeError. |
+ if (!IS_STRING(key)) { |
+ throw MakeTypeError(kProxyHandlerReturned, handler, "non-String", |
+ "enumerate-iterator"); |
+ } |
+ result.push(key); |
} |
+ return result; |
} |
//------------------------------------------------------------------- |