Thinking about it more, I think a parameter of type Function never needs
to be wrapped.  It would get wrapped on any assignment in the function
body.  I just pushed changes to reflect that.

-Alex

On 7/16/17, 11:41 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote:

>Seems reasonable to add a check to see if the function body is for a
>static method.
>
>-Alex
>
>On 7/16/17, 11:25 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>
>>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/DebuggingExam
>>p
>>le/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