On 16.05.2011 1:47, Brendan Eich wrote:
On May 15, 2011, at 1:54 PM, Dmitry A. Soshnikov wrote:
See last reply for more on joining. It occurs to me you thought scope chain
varying in the context of a pure hash-rocket such as #->42 means that function
cannot be joined, but since it is pure, it need not entrain its scope chain as an
internal [[Scope]] property.
More, since # freezes, there's no need for it to be duplicated, since there is
no mutation side channel.
So http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax
proposes freezing and joining, only if the user specifies via the # prefix.
Yep, I got it, thanks, though, as mentioned seems it can be managed then at
engine level without explicit specifying by the user, no?
Do you mean that users shouldn't have to write # prefixes to get joining?
Yeah
That is hard.
Yes, I assumed it though. So from this viewpoint #-funcitons (and
actually #-symbol) is just an addition, perhaps even won't be used
actively by users. Because I can imagine some tutorials explaining it
"don't forget to put # to make a frozen function in case your function
is closed over and doesn't contain free variables". It's OK, though I
think that before reminding do not forget # in such cases, it will be
needed to explain to novice what is a free variable, what is closure,
etc. So probably #-functions will not be wide-spread. Although... But,
it's just thoughts.
Since semantics of # is moved in respect of function, maybe we can it
nevertheless use for records/tuples and for meta-properties of
initialiser (Allen's proposal, don't remember why this topic has became
silent)?
#record = {x: 10, y: 20}; // without proto
#tuple = [1, 2, 3]; // effective dense array
let foo = {x: 10};
let bar = {#proto: foo, y: 20};
SpiderMonkey implements joining for lambdas that do not close over outer
lexical variables provided those lambdas are used as the initializer of a
property in an object literal, or as the full RHS of assignment to a property
of an Object instance. This optimization wins but it requires read and write
barriers (which we already have for getters and setters in general). It's
complex.
Yes, I know that V8 also does it. I.e. if there are no free variables
and no `eval` of course, there's no sense to save [[Scope]]. (JFTR:
Python doesn't save not used free variables even in case of using `eval`
-- yes, it does deep syntactic analysis of inner/ or parent function and
captures only used bindings in a big single frame, but doesn't form a
scope chain of small frames).
So it's a normal optimization techique today I think.
The # prefix means freeze too, and that is required for joining. ES3 left it to
implementations to join but that was a mistake that (if implementations had
done so; none did after early SpiderMonkey bugs were fixed) creates a mutation
side channel.
Yes.
See also the ES3 global regexp singleton per lexical regular expression bug.
Yeah, I'm aware about it of course.
Dmitry.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss