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/DebuggingExamp >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. >>> >> >