You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2019/03/19 23:38:28 UTC

[royale-compiler] branch develop updated: compiler-jx: fixed hoisting issue caused by last commit when default initializers is disabled

This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 3bdad2d  compiler-jx: fixed hoisting issue caused by last commit when default initializers is disabled
3bdad2d is described below

commit 3bdad2d77594580b70b49f371fd2ed7158ed213d
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Tue Mar 19 16:37:41 2019 -0700

    compiler-jx: fixed hoisting issue caused by last commit when default initializers is disabled
---
 .../codegen/js/royale/JSRoyaleEmitter.java         | 33 ++++++++++++++--------
 .../internal/codegen/js/utils/EmitterUtils.java    | 17 +++++++++--
 .../codegen/js/royale/TestDefaultInitializers.java | 16 +++++------
 .../js/sourcemaps/TestSourceMapStatements.java     |  4 +--
 4 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
index 8f9cc44..e3adc32 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
@@ -485,6 +485,16 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
 
     protected void emitHoistedVariablesCodeBlock(IFunctionNode node)
     {
+        boolean defaultInitializers = false;
+        ICompilerProject project = getWalker().getProject();
+        if(project instanceof RoyaleJSProject)
+        {
+            RoyaleJSProject fjsProject = (RoyaleJSProject) project; 
+            if(fjsProject.config != null)
+            {
+                defaultInitializers = fjsProject.config.getJsDefaultInitializers();
+            }
+        }
         Collection<IDefinition> localDefs = node.getScopedNode().getScope().getAllLocalDefinitions();
         for (IDefinition localDef : localDefs)
         {
@@ -492,7 +502,7 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
             {
                 IVariableDefinition varDef = (IVariableDefinition) localDef;
                 IVariableNode varNode = varDef.getVariableNode();
-                if (!EmitterUtils.needsDefaultValue(varNode, getWalker().getProject()))
+                if (!EmitterUtils.needsDefaultValue(varNode, defaultInitializers, getWalker().getProject()))
                 {
                     //already has a default value. no need to hoist.
                     continue;
@@ -800,21 +810,20 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
     @Override
     public void emitVarDeclaration(IVariableNode node)
     {
-        if (EmitterUtils.needsDefaultValue(node, getWalker().getProject()))
+        boolean defaultInitializers = false;
+        ICompilerProject project = getWalker().getProject();
+        if(project instanceof RoyaleJSProject)
         {
-            boolean defaultInitializers = false;
-            ICompilerProject project = getWalker().getProject();
-            if(project instanceof RoyaleJSProject)
+            RoyaleJSProject fjsProject = (RoyaleJSProject) project; 
+            if(fjsProject.config != null)
             {
-                RoyaleJSProject fjsProject = (RoyaleJSProject) project; 
-                if(fjsProject.config != null)
-                {
-                    defaultInitializers = fjsProject.config.getJsDefaultInitializers();
-                }
+                defaultInitializers = fjsProject.config.getJsDefaultInitializers();
             }
-
+        }
+        if (EmitterUtils.needsDefaultValue(node, defaultInitializers, project))
+        {
             IExpressionNode avnode = node.getAssignedValueNode();
-            if (avnode == null && defaultInitializers)
+            if (avnode == null)
             {
                 IFunctionNode parentFunction = (IFunctionNode) node.getAncestorOfType(IFunctionNode.class);
                 if (!isEmittingHoistedNodes(parentFunction))
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
index 079ea94..250a67b 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/EmitterUtils.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.royale.compiler.constants.IASLanguageConstants;
+import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType;
 import org.apache.royale.compiler.definitions.IClassDefinition;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.IFunctionDefinition;
@@ -597,7 +598,7 @@ public class EmitterUtils
                 || node.getContainerType() == IContainerNode.ContainerType.SYNTHESIZED;
     }
 
-    public static boolean needsDefaultValue(IVariableNode node, ICompilerProject project)
+    public static boolean needsDefaultValue(IVariableNode node, boolean defaultInitializers, ICompilerProject project)
     {
         if (node == null)
         {
@@ -638,7 +639,19 @@ public class EmitterUtils
         {
             return false;
         }
-        return true;
+        if (project.getBuiltinType(BuiltinType.ANY_TYPE).equals(varTypeDef)
+                || project.getBuiltinType(BuiltinType.ANY_TYPE).equals(varTypeDef)
+                || project.getBuiltinType(BuiltinType.ANY_TYPE).equals(varTypeDef))
+        {
+            return false;
+        }
+        if (project.getBuiltinType(BuiltinType.INT).equals(varTypeDef)
+                || project.getBuiltinType(BuiltinType.UINT).equals(varTypeDef))
+        {
+            //always true, regardless of -js-default-initializers
+            return true;
+        }
+        return defaultInitializers;
     }
 
 }
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestDefaultInitializers.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestDefaultInitializers.java
index d51246d..6e17484 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestDefaultInitializers.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestDefaultInitializers.java
@@ -110,11 +110,11 @@ public class TestDefaultInitializers extends ASTestBase
     public void testVarDeclaration_noDefaultInitializers_withIntType()
     {
         createConfig(false);
-        IVariableNode node = (IVariableNode) getNode("var a:int;",
-                IVariableNode.class);
-        asBlockWalker.visitVariable(node);
+        IFunctionNode node = (IFunctionNode) getNode("var a:int;",
+                IFunctionNode.class);
+        asBlockWalker.visitFunction(node);
         //an exception that always has an initializer
-        assertOut("var /** @type {number} */ a = 0");
+        assertOut("RoyaleTest_A.prototype.royaleTest_a = function() {\n  var /** @type {number} */ a = 0;\n  //var a;\n}");
     }
 
     @Test
@@ -131,11 +131,11 @@ public class TestDefaultInitializers extends ASTestBase
     public void testVarDeclaration_noDefaultInitializers_withUintType()
     {
         createConfig(false);
-        IVariableNode node = (IVariableNode) getNode("var a:uint;",
-                IVariableNode.class);
-        asBlockWalker.visitVariable(node);
+        IFunctionNode node = (IFunctionNode) getNode("var a:uint;",
+                IFunctionNode.class);
+        asBlockWalker.visitFunction(node);
         //an exception that always has an initializer
-        assertOut("var /** @type {number} */ a = 0");
+        assertOut("RoyaleTest_A.prototype.royaleTest_a = function() {\n  var /** @type {number} */ a = 0;\n  //var a;\n}");
     }
 
     @Test
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
index cca0683..d13a577 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapStatements.java
@@ -65,13 +65,13 @@ public class TestSourceMapStatements extends SourceMapTestBase
     @Test
     public void testVarDeclaration_withType()
     {
-        IVariableNode node = (IVariableNode) getNode("var a:int;",
+        IVariableNode node = (IVariableNode) getNode("var a:Number;",
                 IVariableNode.class);
         asBlockWalker.visitVariable(node);
         //var /** @type {number} */ a
         assertMapping(node, 0, 0, 0, 0, 0, 4);   // var
         assertMapping(node, 0, 4, 0, 26, 0, 27); // a
-        assertMapping(node, 0, 5, 0, 4, 0, 26);  // :int
+        assertMapping(node, 0, 5, 0, 4, 0, 26);  // :Number
     }
 
     @Test