A directive could be a solution.

But I think this is an issue with any static method. If a closure is used 
inside a static method, or a function declared inside a static method, it 
should not use Language.closure.

FWIW, the Google compile complains about “this” being used in a static method 
as well:

    [mxmlc] Jul 16, 2017 7:26:08 PM 
com.google.javascript.jscomp.LoggerErrorManager println
    [mxmlc] WARNING: 
/Users/harbs/Documents/ApacheFlex/flex-asjs/examples/flexjs/DebuggingExample/bin/js-debug/org/apache/flex/utils/callLater.js:35:
 WARNING - dangerous use of this in static method 
org.apache.flex.utils.callLater
    [mxmlc]   setTimeout(org.apache.flex.utils.Language.closure(makeCalls, 
this, 'makeCalls'), 0);

Package level functions should be treated as static methods.

It might not be a bad idea to add a directive to allow developers to avoid 
Language.closure calls at will, but I think the “correct” general solution is 
to never output Language.closure in static and package level functions.

> On Jul 17, 2017, at 9:16 AM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> I don't see any current way to suppress the Language.closure.  Without
> flow-analysis, I'm not sure the compiler can tell.  It could guess that
> the identifier is a parameter, but the parameter variable could be
> assigned within the function body.
> 
> We could add a new directive like @flexjsisclosure or something like that.
> 
> Thoughts?
> -Alex
> 
> On 7/16/17, 10:05 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> I figured out the problem.
>> 
>> org.apache.flex.utils.callLater has the following code:
>> setTimeout(makeCalls, 0);
>> 
>> That compiles to:
>> setTimeout(org.apache.flex.utils.Language.closure(makeCalls, this,
>> 'makeCalls'), 0);
>> 
>> When Language.closure is called, it messes up the scope of the calls
>> variable and subsequent calls to makeCalls step on each other. I believe
>> this is because makeCalls is bound to the package object of the callLater
>> function.
>> 
>> Is there any way to prevent rewriting of function calls to
>> Language.closure?
>> 
>> If "setTimeout(makeCalls, 0);" is cross-compiled exactly to:
>> "setTimeout(makeCalls, 0);", it works like I’d expect it to.
>> 
>> Thanks,
>> Harbs
>> 
>>> On Jul 16, 2017, at 3:46 PM, Harbs <harbs.li...@gmail.com> wrote:
>>> 
>>> Interesting to note:
>>> 
>>> Adding a number of callLater() calls resulted in only the first one
>>> being called in JS. I did not try as a SWF.
>> 
> 

Reply via email to