[
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)