Allen Wirfs-Brock <mailto:[email protected]>
September 23, 2013 3:06 PM
It's a matter of internal vs external consistency. The implementor of
a Proxy handler needs to internally consistently implement the 'get',
'set', 'has', 'invoke', etc. traps in order to manifest an object that
exhibits the normally expected object semantics. But there is no fool
proof (I contend) way for the proxy implementor to achieve 'invoke'
consistency with 'get+F.p.call
Now it depends on what you mean by "fool proof".
JS programmer have been trained that:
obj.m(args)
is equivalent to:
let f = obj.m;
f.call(obj, args)
Sometimes they place additional code between the property access and
the call. That code might make the call conditional. It might memorize
f and obj in order to defer the call to an arbitrary point in the future.
Prior to proxies this was always valid because the semantics of both,
at the MOP level were: f = obj.[[Get]]("m"); f.[[Call]](obj,args). But
with proxies and [[Invoke]], this equivalent is no longer the case.
Vacuously true, and why we resisted invoke.
And with the current definition of F.p.call/apply there is nothing
that the client code can do to reestablish the consistency.
To use either F.p.call or .apply, you must do obj.[[Get]]("m"). For
function objects, [[Call]] is well-specified and what F.p.{c,a} use.
For proxies, we need something akin to [[Call]]. Is that the point of
[[InvokeFunction]]?
This can be fixed, if obj.m(args) has the semantics of
[[Get]]+[[InvokeFunction]] and F.p.call/apply also uses
[[InvokeFunction]] (noting that is the vast majority of cases
[[InvokeFunction]] is exactly the same as [[Call]].
Ok, but then Tom asked whether function objects targeted by direct
proxies having their [[Call]] overridden was a problem?
The JS programmers expected equivalence is maintained yet transparent
proxies still have an opportunity to do forward of this values.
BTW, it also restore left to right evaluation of the call operator
which regressed when the call operator was implemented using [[Invoke]].
If you can rename [[InvokeFunction]] to [[Invoke]] so my head stops
exploding, I think we have a deal. But need Tom on board.
/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss