Le 12/09/2012 08:19, Tom Van Cutsem a écrit :
2012/9/11 Mark S. Miller <[email protected] <mailto:[email protected]>>

    [...]
    If we change this API from returning an array of strings to
    returning an iterator, I agree that alters the balance and
    justifies waiving this particular guarantee.


I also don't see any real issues with waiving the duplicate names check. It's unrelated to the usual non-configurability/non-extensibility invariants.

Just to spell it out, that would mean that in the following code:

for (var name in obj) { ... }

where obj is either a proxy or an object with a proxy in its prototype chain, |name| can be bound to the same string multiple times through the loop.
There are numerous examples where ES5 assumptions are questioned by proxies, like:

    for(var p in obj){
        var desc = Object.getOwnPropertyDescriptor(obj, p)
        // ...
    }

In this snippet, ES5 semantics guarantees that desc will be an object at every iteration. Proxies challenge this assumption (because of the enumerate trap, but also the combination between the enumerate and getOwnPropertyDescriptor trap). But as Mark said, there is a trade-off to be found.

Note that even if we would waive the duplicate property check, the proxy still needs to return a wrapped iterator for the enumerate() trap to:
- coerce each produced value to a String
- check whether all non-configurable enumerable properties of the target have been produced. One way to check this would be to retrieve these properties in a set before the start of the loop, and remove each encountered property from the set. If, after the very last loop iteration, the set is non-empty, the proxy throws a TypeError.
Sounds good and it doesn't sound like there is additional cost against the current design. For the second check, I'd like to note a couple of implementation details which are relevant I think. First, as you suggest, the set of minimum reported properties has to be decided before the first iteration (otherwise, this set may change over the course of the loop). Second, an unanswered question is how this set is being retrieved. Is the JS runtime performing an Object.getOwnPropertyDescriptor on the proxy (calling the trap)? on the target directly? If the target is itself a proxy, on the target at the end of the chain (so that no intermediate trap is being called)? Right now, I have no preference for any of these solutions, but it's a detail that will be visible from user script, so it needs to be decided for the sake of interoperability.

David
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to