flex-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alex Harui (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (FLEX-34984) for-each loops cross-compile incorrectly
Date Fri, 11 Dec 2015 06:43:10 GMT

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

Mime
View raw message