(Sorry for the delay of response, I am currently in a remote area.)

> Le 6 juil. 2014 à 20:15, André Bargull <andre.barg...@udo.edu> a écrit :
> 
> 
>> Moreover, the Completion record (either normal or abrupt) returned
>> from [[Call]] will hold an additional [[thisValue]] field,
>> which, unless otherwise specified:
>> 
>> * is set to the original `thisArgument` if it was not empty; or,
>> * is set to the value (at the time of completion) of the this-binding,
>> if it was initially uninitialised but has been initialised; or,
>> * is absent if the this-binding was left uninitialised.
> 
> Hmm, mixed feelings about extending the Completion record type to hold 
> another field. It could be problematic for implementors to store this 
> additional state efficiently. On second thought, it should be possible to 
> merge [[thisValue]] with the existing [[Value]] field, and conditionally 
> handle [[Value]] == empty in [[Construct]]? [1]

An issue here is that I want to initialise the this-binding of the caller even 
when the callee ends abruptly (with `throw`).

> 
> 
>> Moreover, the Completion record (either normal or abrupt) returned
>> from [[Call]] will hold an additional [[thisValue]] field,
>> which, unless otherwise specified:
>> 
>> * is set to the original `thisArgument` if it was not empty; or,
>> * is set to the value (at the time of completion) of the this-binding,
>> if it was initially uninitialised but has been initialised; or,
>> * is absent if the this-binding was left uninitialised.
> 
> Tail-call semantics may interfere with determining the value of "this-binding 
> at the time of completion", because the execution context was already popped 
> from the stack at that time. Probably solvable by determining the 
> this-binding before performing the tail-call, plus some special casing when 
> the tail-call expression is a super-call.
> 
> 
>> --------------------------------
>> 
>> When, say, `super.method(..args)` is called, the following steps are taken:
>> 
>> 1. Let `F` be the method referenced by `super.method`.
> 
> This part needs to be redefined. `super.method` is an abbreviation for:
> 
> 1. Let env be GetThisEnvironment().
> 2. Let baseValue be GetSuperBase(env).
> 3. Let actualThis be GetThisBinding().
> 4. Let result be baseValue.[[Get]]("method", actualThis).
> 
> But at `this`-binding initialisation time, `actualThis` is still the empty 
> placeholder object, so it cannot be used as the receiver argument for the 
> [[Get]] internal method call.
> 
> 
> [1] https://gist.github.com/anba/e6b525c124d09dafaed6

Here is another setting that I've thought of: When `super` is called with a 
not-yet-initialised this-binding, the this-binding of the callee is in fact a 
special pointer to the function environment record of the caller, and when the 
callee wants to read or update it's this-binding, it reads or update the one of 
the caller. 

—Claude


_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to