You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flex.apache.org by "Alex Harui (JIRA)" <ji...@apache.org> on 2015/12/11 07:43:10 UTC

[jira] [Commented] (FLEX-34984) for-each loops cross-compile incorrectly

    [ https://issues.apache.org/jira/browse/FLEX-34984?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15052287#comment-15052287 ] 

Alex Harui commented on FLEX-34984:
-----------------------------------

Are you sure that it is always safe to store the results of the expression in a local variable?  What if the body of the loop is mutating the objects involved in the expression so that the expression returns different results?  Like deleting something in the body of the loop?

> for-each loops cross-compile incorrectly
> ----------------------------------------
>
>                 Key: FLEX-34984
>                 URL: https://issues.apache.org/jira/browse/FLEX-34984
>             Project: Apache Flex
>          Issue Type: Bug
>          Components: Falcon, FlexJS
>    Affects Versions: Apache FlexJS 0.5.0
>            Reporter: Andy Dufilie
>
> When you write a for-each loop, the iterable gets re-evaluated on every iteration.
> Example code:
> {code}
> for each (var item:Object in Test.getItems()) {
> 	Test.doSomething(item);
> }
> {code}
> Cross-compiled:
> {code}
>   for (var foreachiter0 in Test.getItems()) 
>   {
>   var item = Test.getItems()[foreachiter0];
>   {
>     Test.doSomething(item);
>   }}
> {code}
> It should not call Test.getItems() on every loop iteration. Instead, it should generate a new local variable prior to entering the loop to store the result.
> I can see problematic code in three places:
> * JSGeneratingReducer.java: https://github.com/apache/flex-falcon/blob/develop/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSGeneratingReducer.java#L3426
> * ForEachEmitter.java: https://github.com/apache/flex-falcon/blob/develop/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
> * JSVF2JSEmitter.java: https://github.com/apache/flex-falcon/blob/develop/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java#L1708
> Another solution would be to use a for...of loop, Standard in ES6, though that won't work in Internet Explorer: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)