You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2015/12/11 20:41:53 UTC

git commit: [flex-falcon] [refs/heads/develop] - FLEX-34984 try a different pattern for for-each conversion

Repository: flex-falcon
Updated Branches:
  refs/heads/develop b5e8f73d1 -> f00f85951


FLEX-34984 try a different pattern for for-each conversion


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f00f8595
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f00f8595
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f00f8595

Branch: refs/heads/develop
Commit: f00f85951d52d68f445f001504dfa03ad8e1ee8c
Parents: b5e8f73
Author: Alex Harui <ah...@apache.org>
Authored: Fri Dec 11 11:41:42 2015 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Fri Dec 11 11:41:42 2015 -0800

----------------------------------------------------------------------
 .../js/flexjs/TestFlexJSGlobalClasses.java      |  2 +-
 .../codegen/js/flexjs/TestFlexJSStatements.java | 24 ++++++++++++++------
 .../internal/codegen/js/jx/ForEachEmitter.java  | 17 +++++++++++---
 3 files changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f00f8595/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 322ee63..3b130f5 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -380,7 +380,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
     	IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");for each (var p:XMLList in a) var i:int = p.length();");
         asBlockWalker.visitForLoop(node);
-        assertOut("for (var foreachiter0 in a.elementNames()) \n{\nvar p = a.child(foreachiter0);\n\n  var /** @type {number} */ i = p.length();}\n");
+        assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = foreachiter0_target.child(foreachiter0);\n\n  var /** @type {number} */ i = p.length();}\n");
     }
     
     @Ignore

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f00f8595/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
index e635630..bbf5d16 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
@@ -141,7 +141,7 @@ public class TestFlexJSStatements extends TestGoogStatements
         IForLoopNode node = (IForLoopNode) getNode(
                 "for each(var i:int in obj) { break; }", IForLoopNode.class);
         asBlockWalker.visitForLoop(node);
-        assertOut("for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n{\n  break;\n}}\n");
+        assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n  break;\n}}\n");
     }
 
     @Override
@@ -151,7 +151,16 @@ public class TestFlexJSStatements extends TestGoogStatements
         IForLoopNode node = (IForLoopNode) getNode(
                 "for each(var i:int in obj)  break; ", IForLoopNode.class);
         asBlockWalker.visitForLoop(node);
-        assertOut("for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n\n  break;}\n");
+        assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n\n  break;}\n");
+    }
+
+    @Test
+    public void testVisitForEach_2()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj.foo()) { break; }", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        assertOut("var foreachiter0_target = obj.foo();\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n  break;\n}}\n");
     }
 
     @Test
@@ -160,7 +169,7 @@ public class TestFlexJSStatements extends TestGoogStatements
         IForLoopNode node = (IForLoopNode) getNode(
                 "var i:int; for each(i in obj)  break; ", IForLoopNode.class);
         asBlockWalker.visitForLoop(node);
-        assertOut("for (var foreachiter0 in obj) \n{\ni = obj[foreachiter0];\n\n  break;}\n");
+        assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\ni = foreachiter0_target[foreachiter0];\n\n  break;}\n");
     }
 
     //----------------------------------
@@ -406,7 +415,7 @@ public class TestFlexJSStatements extends TestGoogStatements
                 "foo: for each(var i:int in obj) { break foo; }",
                 LabeledStatementNode.class);
         asBlockWalker.visitLabeledStatement(node);
-        assertOut("foo : for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n{\n  break foo;\n}}\n");
+        assertOut("foo : var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n  break foo;\n}}\n");
     }
 
     @Override
@@ -418,7 +427,7 @@ public class TestFlexJSStatements extends TestGoogStatements
                 "foo: for each(var i:int in obj) break foo;",
                 LabeledStatementNode.class);
         asBlockWalker.visitLabeledStatement(node);
-        assertOut("foo : for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n\n  break foo;}\n");
+        assertOut("foo : var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n\n  break foo;}\n");
     }
 
     //----------------------------------
@@ -528,9 +537,10 @@ public class TestFlexJSStatements extends TestGoogStatements
         		              "      eee.dd;\n" +
         		              "    }\n" +
         		              "  }\n" +
-        		              "  foo : for (var foreachiter0 in obj) \n" +
+        		              "  foo : var foreachiter0_target = obj;\n" +
+        		              "  for (var foreachiter0 in foreachiter0_target) \n" +
         		              "  {\n" +
-        		              "  var i = obj[foreachiter0];\n" +
+        		              "  var i = foreachiter0_target[foreachiter0];\n" +
         		              "  \n" +
         		              "    break foo;}\n" +
         		              "  ;\n};\n\n\n" +

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f00f8595/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
index cf151b5..7cc335b 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
@@ -52,6 +52,18 @@ public class ForEachEmitter extends JSSubEmitter implements
 
         final String iterName = getModel().getCurrentForeachName();
         getModel().incForeachLoopCount();
+        final String targetName = iterName + "_target";
+        
+        write(ASEmitterTokens.VAR);
+        write(ASEmitterTokens.SPACE);
+        write(targetName);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.EQUAL);
+        write(ASEmitterTokens.SPACE);
+        IASNode obj = bnode.getChild(1);
+        getWalker().walk(obj);
+        write(ASEmitterTokens.SEMICOLON);
+        writeNewline();
 
         write(ASEmitterTokens.FOR);
         write(ASEmitterTokens.SPACE);
@@ -62,8 +74,7 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.IN);
         write(ASEmitterTokens.SPACE);
-        IASNode obj = bnode.getChild(1);
-        getWalker().walk(obj);
+        write(targetName);
         boolean isXML = false;
         if (obj.getNodeID() == ASTNodeID.IdentifierID)
         {
@@ -96,7 +107,7 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(ASEmitterTokens.EQUAL);
         write(ASEmitterTokens.SPACE);
-        getWalker().walk(obj);
+        write(targetName);
         if (isXML)
         {
         	write(".child(");