2013/9/10 Jason Orendorff <[email protected]> > I think the simplest thing would be to replace [[Invoke]] with a > [[GetMethod]] trap, and the idiom would then be exactly as above, but > change `Get` to `GetMethod`. > > The last step of Invoke(O, P, args) would be replaced with: > > 6. Let method = O.[[GetMethod]](P, O). > 7. ReturnIfAbrupt(method). > 8. If IsCallable(method) is false, throw a TypeError. > 9. Return method.[[Call]](O, args). > > For ordinary objects, [[GetMethod]] would be exactly like [[Get]]. The > default proxy.[[GetMethod]] algorithm would be slightly different: it > would return a bound function object, bound to the target. > > tomvc, I'm not sure why [[Has]] followed by [[Invoke]] is worse for > double-lifting than [[Get]] followed by [[Call]], but this change > would bring us back closer to the latter. Is that sufficient? >
[[Has]] followed by [[Invoke]] would trigger 2 distinct traps on the handler. [[Get]] followed by [[Call]] only triggers the "get" trap on the handler. The [[Call]] is made on the returned callable, it does not trigger the handler's "apply" trap. The point I was making is that using the current design, double-lifting requires implementing only 1 trap. Your proposed [[GetMethod]] would re-introduce the bound-function-per-call overhead that the current [[Invoke]] design got rid of (see also my downstream reply to Allen). cheers, Tom
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

