On Nov 9, 2011, at 3:53 AM, Tom Van Cutsem wrote:

> 2011/11/8 Allen Wirfs-Brock <[email protected]>
> On Nov 8, 2011, at 7:33 AM, Andreas Rossberg wrote:
> > But I have a follow-up request. :) Regarding redundant trap calls with
> > proxies there is another, more pervasive problem with the current
> > spec: in lots of places it first calls [[HasProperty]] and then
> > [[Get]]. With proxies, this always implies two trap calls, which seems
> > wasteful. Would it be possible to refactor that, too?
> >
> > Seems more difficult, because we would need to enable [[Get]] (and
> > hence the get trap) to signal lookup failure.  (Too bad that we cannot
> > reuse `undefined' for it.) But I think the current situation isn't
> > satisfactory.
> 
> I agree, the current specification style is fine when we are dealing with 
> side-effectly free internal operations but as soon as they are reified they 
> become problematic and a performance issue.
> 
> Is the situation really that problematic?
> Skimming the ES5.1 spec for [[HasProperty]], I encounter calls in the 
> following places:
> 
> - ToPropertyDescriptor conversion (only triggers proxy code via 
> Object.defineProperty(obj, name, aProxyAsDescriptor) and 
> Object.defineProperties).
> 
> - lots of methods on Array.prototype (map, forEach, filter, some, reduce, 
> reduceRight, reverse, splice, indexOf, lastIndexOf, every, shift, slice, 
> sort, unshift): the only way in which these trigger proxy code is when |this| 
> is a proxy, i.e. when they are called as 
> Array.prototype.theMethod.call(aProxy).
> (calling aProxy.theMethod triggers the proxy's "get" trap)
> 
> - Array.prototype.concat: [[HasProperty]] is called on a built-in Array only.

the array methods are my primary concern as the HasProperty/Get combination is 
used to preserve "holes" as the algorithms iterate over "arrays".  On large 
arrays, there can be lots of these calls.

However, I'm not sure I understand your comments about theMethod.call(aProxy) 
vs. aProxy.theMethod(). In either case when theMethod is actually executed the 
this value must be aProxy and the internal calls to [[HasProperty]] and [[Get]] 
need to trap. 

> 
> - 10.2.1.2 Object environment records uses [[HasProperty]] in a number of 
> places. Isn't this needed only for |with|, so only triggered by |with 
> (aProxy) { ... }|? Since ES.next builds on ES5/strict, this doesn't seem to 
> carry much weight.

And for global object bindings. It still has to work, consider for example, a 
proxy based DOM object that is accessed from non-Harmony code.  The global 
object, it self, might be a Proxy.

> 
> - The in operator: only calls [[HasProperty]], not followed by a call to 
> [[Get]] (so it's not an instance of the "conditional [[Get]]" pattern).
> 
> None of the conditional [[Get]] patterns on proxies seem particularly common 
> operations, even if proxies would be widely used. Are they worth the 
> complexity of changing one of the most critical and common operations in 
> Javascript?

The array functions are my primary concern.

Allen

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

Reply via email to