On Sep 10, 2013, at 10:45 AM, Jason Orendorff wrote:

> On Tue, Sep 10, 2013 at 11:11 AM, Allen Wirfs-Brock
> <[email protected]> wrote:
>> Having to create a new bound function on every method call seems too 
>> expensive.
> 
> Only for proxy method calls, and it's easily optimized away in the
> default case (i.e. there is no .getMethod handler method).
> 
> (As an aside, exchanges like the above have gotten so frequent they
> are beginning to feel a bit pro forma. I don't mean to sweep all
> performance concerns into one pile here.)
> 
>> But what about:
>> 
>> 6. Let method = O.[[Get]](P).
>> 7. ReturnIfAbrupt(method).
>> 8. If IsCallable(method) is false, throw a TypeError.
>> 9. Return O.[[InvokeFunction]](method,O, args).
>> 
>> Using [[InvokeFunction]] the Proxy still mediates the [[Call]] to method but 
>> it is assume the [[Get]] step has already been performed and has produced 
>> method.
> 
> This is appealing. There are a few things [[GetMethod]] can do that
> this can't: [[InvokeFunction]] can't be used to make a proxy that
> mimics the behavior of __noSuchMethod__, for example. I don't think it
> can mimic ActionScript 3 Proxy.callMethod either.

Well, we didn't have those capabilities before we added [[Invoke]] and neither 
were primary use cases that motivated [[Invoke]].

> 
> If [[InvokeFunction]] is deemed powerful enough, I'm all for it.
> 

I was thinking we might only need to have [[InvokeFunction]] but if we had both 
it and [[Invoke]] then then we'd only have we'd only those those capability in 
situations that required a conditional invoke.  However, that would still 
create an anomalous edge case, for example toJSON not triggering a 
__noSuchMethod__ emulator.  Should it?

I'm beginning to like a conditional option on [[Invoke]].

Consider: [[Invoke]](P, ArgumentsList, Receiver, conditional=false)

If conditional is false, it works just like the current [[Invoke]] spec.

If conditional is true and the [[Get]] value is not callable (this includes 
undefined for a missing property) result is: [false, [[Get]] result].
if conditional is true and the [[Get]] value is callable, result is [true, 
value returned from [[Call]]

The conditional form would only be used  in odd cases like the toJSON call.

ES code can accomplish the same thing via Reflect.invoke with true as the 4th 
argument.

Allen

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

Reply via email to