Without actually looking at the compiler, I think that functions that are not 
methods are pulled out and declared early for ES5 (strict?) reasons.  I'm not 
sure there is a good distinction between a "local function" and assigning a 
function to something.

IIRC, "assigning" some functions like in a function as a parameter like 
addEventListener is supposed to generate Language.closure wrappers to make a 
"closure" and bind the 'this' pointer to the method.

I'm unclear as to what the desired JS output really should be.  Would it really 
work in JS if the function was directly assigned to a slot on the instance 
instead of a temporary variable first?  If so why?

I'm also surprised that in JS, a function call can't have its 'this' pointer 
reassigned by Function.call.  What is the actual JS that is running?

-Alex

On 6/17/18, 7:29 AM, "Harbs" <[email protected]> wrote:

    An additional related problem:
    
    Using “call” with a different “this” will not work with the aliased 
functions either.
    
    This is proving to be a challenge for me…
    
    Harbs
    
    > On Jun 17, 2018, at 12:02 PM, Harbs <[email protected]> wrote:
    > 
    > I have the following class:
    > 
https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2Fr7Ek&data=02%7C01%7Caharui%40adobe.com%7Cd50a81aaa8f8453ae0f408d5d45eb567%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636648425616368813&sdata=5Jz5bTTwhdwweaam%2BghkMCSwkM4WWyqnWHhr%2BrDpub8%3D&reserved=0
 
<https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2Fr7Ek&data=02%7C01%7Caharui%40adobe.com%7Cd50a81aaa8f8453ae0f408d5d45eb567%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636648425616368813&sdata=5Jz5bTTwhdwweaam%2BghkMCSwkM4WWyqnWHhr%2BrDpub8%3D&reserved=0>
    > 
    > Which gets cross-compiled to:
    > 
https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2F3k1r&data=02%7C01%7Caharui%40adobe.com%7Cd50a81aaa8f8453ae0f408d5d45eb567%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636648425616378822&sdata=t50ucBXXnOezZW9mt%2BuMH5J5N%2BlJGGJBoBer7SkYU7I%3D&reserved=0
 
<https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2F3k1r&data=02%7C01%7Caharui%40adobe.com%7Cd50a81aaa8f8453ae0f408d5d45eb567%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636648425616378822&sdata=t50ucBXXnOezZW9mt%2BuMH5J5N%2BlJGGJBoBer7SkYU7I%3D&reserved=0>
    > 
    > The problem is here:
    > struct.process = function():void {
    >     if (this.version === 0) {
    >         for (var i:int = 0; i < this.offsets.length; i++) {
    >             this.offsets[i] <<= 1;
    >         }
    >     }
    > };
    > 
    > In this case, “this” refers to the “struct” VersionedStruct instance. (At 
least in Javascript. Am I correct in assuming that’s the case in ActionScript 
as well?)
    > 
    > However, it gets cross-compiled to the following where “this" is the 
global this:
    > 
    > var /** @type {Function} */ __localFn0__ = function() {
    >   if (this.version === 0) {
    >     for (var /** @type {number} */ i = 0; i < this.offsets.length; i++) {
    >       this.offsets[i] <<= 1;
    >     }
    >   }
    > }
    > com.printui.fontkit.tables.loca.struct.process = __localFn0__;
    > 
    > What is the purpose of pulling the inline function out?
    > 
    > Harbs
    
    

Reply via email to