On Jun 21, 2011, at 11:33 AM, Oliver Hunt wrote: > I'm answering some of the performance questions in this, but i don't know > what the intended semantics of 'dynamic super' would be so I can't give > specific details of most of the use cases. If it's essentially sugar for > super.foo => Object.getPrototypeOf(this).foo (with appropriate munging for > calls, etc) then the cost is at point of use only, but if it's anything more > fun (there are references to additional implicit parameters below which would > be fairly bad for performance of calls)
That's the point: super must mean something other than Object.getPrototypeOf(this). Otherwise with the prototypal pattern you will infinitely recurse calling the same prototype-homed foo from foo via super.foo(). If super was shorthand only for Object.getPrototypeOf(this), then there's hardly any point in making super short for that expression. Axel's notion of a |here| object helps, in that Object.getPrototypeOf(here) is more what you want from 'super' -- but not necessarily when the method has been borrowed by another object used as |here|. Note the "necessarily" -- you may know how to rebind 'super', but you may not. Allen's Object.defineMethod requires an affirmative defense before you can rebind super. It's a safety step, since 'super' is an internal function property and *not* a free parameter. BTW I do not agree we can or should try to reserve 'here' or expose the method's "home object" -- that breaks abstractions built using prototypes. 'super' does not, because it always goes to the [[Prototype]] of the object in which the method was defined. /be > > On Jun 21, 2011, at 11:04 AM, Sean Eagan wrote: >> I disagree that a dynamic super would lead to a '50% increase in > >> argument passing overhead, on average'. First, there is the implicit >> 'arguments' argument, which is an object that actually needs to be >> created per call site, not just a binding, and thus is presumably much >> more expensive. > Nope, creating an arguments object is on average free, as most uses can be > lowered. > >> Second, 'argument passing overhead' involves sunk >> costs that are not dependent on the number of argument bindings that >> need to be created. > Every additional argument has a performance cost > >> Third, implicit arguments, as 'super' would be, >> should be less costly than explicit arguments since the argument value >> does not need to be resolved. > > I haven't really been following this but why does super need to be passed as > an additional parameter? > >> >> A better estimate of the overhead of dynamic super would probably be >> the overhead of an implicit 'this' binding, i.e. the cost of creating >> a 'this' binding for a function activation that not involving an >> explicit 'this' via Function.prototype.call or >> Function.prototype.apply, or Function.prototype.bind. Does anyone >> have any estimates of this cost, either absolute or relative to some >> other cost? > > That depends on the exact use case. JSC doesn't determine what |this| is at > the callsite (In general strict mode makes that impossible), so it becomes a > question of whether you use it or not. > >> I was unaware that dynamic super had been discussed, proposed, or >> attempted previously for ES, or that it was ever included to have >> 'pervasive overhead'. Do you any references for this? > > No idea -- it would depend on what the actual semantics of super were >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss