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 7708d9e  compiler-jx: simple numeric literals assigned to int or uint 
values are now coerced at compile time (references #74)
7708d9e is described below

commit 7708d9e7af8029900035ceceb6f5b887761bf915
Author: Josh Tynjala <[email protected]>
AuthorDate: Mon Feb 4 13:31:18 2019 -0800

    compiler-jx: simple numeric literals assigned to int or uint values are now 
coerced at compile time (references #74)
    
    Uses toInt32() and toUint32() methods on INumericLiteralNode.INumericValue 
that are actually intended for this purpose.
---
 .../compiler/internal/codegen/js/JSEmitter.java    | 20 +++----
 .../codegen/js/jx/BinaryOperatorEmitter.java       | 61 +++++++++++-----------
 .../codegen/js/jx/VarDeclarationEmitter.java       | 24 +++++----
 .../codegen/js/royale/TestRoyaleExpressions.java   | 45 +++++++++++++++-
 .../codegen/js/royale/TestRoyaleFieldMembers.java  | 24 +++++++++
 .../codegen/js/royale/TestRoyaleStatements.java    | 13 ++++-
 .../js/sourcemaps/TestSourceMapExpressions.java    | 30 +++++++++++
 7 files changed, 164 insertions(+), 53 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
index 997c562..ddb6e0b 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
@@ -534,10 +534,11 @@ public class JSEmitter extends ASEmitter implements 
IJSEmitter
                        if (assignedNode instanceof INumericLiteralNode)
                        {
                                INumericLiteralNode numericLiteral = 
(INumericLiteralNode) assignedNode;
-                               if 
(!BuiltinType.INT.equals(numericLiteral.getNumericValue().getAssumedType()))
-                               {
-                                       needsCoercion = true;
-                               }
+                INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                startMapping(assignedNode);
+                write(Integer.toString(numericValue.toInt32()));
+                endMapping(assignedNode);
+                return;
                        }
                        else 
if(!project.getBuiltinType(BuiltinType.INT).equals(assignedDef))
                        {
@@ -554,11 +555,12 @@ public class JSEmitter extends ASEmitter implements 
IJSEmitter
                        boolean needsCoercion = false;
                        if (assignedNode instanceof INumericLiteralNode)
                        {
-                               INumericLiteralNode numericLiteral = 
(INumericLiteralNode) assignedNode;
-                               if 
(!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType()))
-                               {
-                                       needsCoercion = true;
-                               }
+                INumericLiteralNode numericLiteral = (INumericLiteralNode) 
assignedNode;
+                INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                startMapping(assignedNode);
+                write(Long.toString(numericValue.toUint32()));
+                endMapping(assignedNode);
+                return;
                        }
                        else 
if(!project.getBuiltinType(BuiltinType.UINT).equals(assignedDef))
                        {
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 0c164d1..629a0d9 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -448,6 +448,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
             }
                        String coercionStart = null;
                        String coercionEnd = null;
+                       String coercedValue = null;
             if (isAssignment)
             {
                                if 
(getProject().getBuiltinType(BuiltinType.INT).equals(leftDef))
@@ -455,11 +456,9 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                        boolean needsCoercion = false;
                                        if (rNode instanceof 
INumericLiteralNode)
                                        {
-                                               INumericLiteralNode rNumber = 
(INumericLiteralNode) rNode;
-                                               if 
(!BuiltinType.INT.equals(rNumber.getNumericValue().getAssumedType()))
-                                               {
-                                                       needsCoercion = true;
-                                               }
+                                               INumericLiteralNode 
numericLiteral = (INumericLiteralNode) rNode;
+                                               
INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                                               coercedValue = 
Integer.toString(numericValue.toInt32());
                                        }
                                        else 
if(!getProject().getBuiltinType(BuiltinType.INT).equals(rightDef))
                                        {
@@ -476,11 +475,9 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                        boolean needsCoercion = false;
                                        if (rNode instanceof 
INumericLiteralNode)
                                        {
-                                               INumericLiteralNode rNumber = 
(INumericLiteralNode) rNode;
-                                               if 
(!BuiltinType.UINT.equals(rNumber.getNumericValue().getAssumedType()))
-                                               {
-                                                       needsCoercion = true;
-                                               }
+                                               INumericLiteralNode 
numericLiteral = (INumericLiteralNode) rNode;
+                                               
INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                                               coercedValue = 
Long.toString(numericValue.toUint32());
                                        }
                                        else 
if(!getProject().getBuiltinType(BuiltinType.UINT).equals(rightDef))
                                        {
@@ -518,8 +515,8 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                                }
                                        }
                                }
-            }
-            super_emitBinaryOperator(node, coercionStart, coercionEnd);
+                       }
+            super_emitBinaryOperator(node, coercionStart, coercionEnd, 
coercedValue);
                
             /*
             IExpressionNode leftSide = node.getLeftOperandNode();
@@ -600,7 +597,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
        return false;
     }
 
-    private void super_emitBinaryOperator(IBinaryOperatorNode node, String 
coercionStart, String coercionEnd)
+    private void super_emitBinaryOperator(IBinaryOperatorNode node, String 
coercionStart, String coercionEnd, String coercedValue)
     {
         if (ASNodeUtils.hasParenOpen(node))
             write(ASEmitterTokens.PAREN_OPEN);
@@ -671,24 +668,26 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                        {
                                write(coercionStart);
                        }
-            /*
-            IDefinition definition = 
node.getRightOperandNode().resolve(getProject());
-               if (definition instanceof FunctionDefinition &&
-                               (!(definition instanceof AccessorDefinition)))
-               {
-               }
-               else */
-                       getWalker().walk(node.getRightOperandNode());
-                if (node.getNodeID() == ASTNodeID.Op_InID &&
-                        
((JSRoyaleEmitter)getEmitter()).isXML(node.getRightOperandNode()))
-                {
-                       write(".elementNames()");
-                }   
-                else if (node.getNodeID() == ASTNodeID.Op_InID &&
-                        
((JSRoyaleEmitter)getEmitter()).isProxy(node.getRightOperandNode()))
-                {
-                       write(".propertyNames()");
-                }
+                       if (coercedValue != null)
+                       {
+                               startMapping(node.getRightOperandNode());
+                               write(coercedValue);
+                               endMapping(node.getRightOperandNode());
+                       }
+                       else
+                       {
+                               getWalker().walk(node.getRightOperandNode());
+                       }
+                       if (node.getNodeID() == ASTNodeID.Op_InID &&
+                                       
((JSRoyaleEmitter)getEmitter()).isXML(node.getRightOperandNode()))
+                       {
+                               write(".elementNames()");
+                       }   
+                       else if (node.getNodeID() == ASTNodeID.Op_InID &&
+                                       
((JSRoyaleEmitter)getEmitter()).isProxy(node.getRightOperandNode()))
+                       {
+                               write(".propertyNames()");
+                       }
         }
 
                if (coercionStart != null)
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
index b149de8..6adceae 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java
@@ -183,16 +183,15 @@ public class VarDeclarationEmitter extends JSSubEmitter 
implements
             }
             String coercionStart = null;
             String coercionEnd = null;
+            String coercedValue = null;
             if 
(getProject().getBuiltinType(BuiltinType.INT).equals(variableDef))
             {
                 boolean needsCoercion = false;
                 if (avnode instanceof INumericLiteralNode)
                 {
                     INumericLiteralNode numericLiteral = (INumericLiteralNode) 
avnode;
-                    if 
(!BuiltinType.INT.equals(numericLiteral.getNumericValue().getAssumedType()))
-                    {
-                        needsCoercion = true;
-                    }
+                    INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                    coercedValue = Integer.toString(numericValue.toInt32());
                 }
                 else 
if(!getProject().getBuiltinType(BuiltinType.INT).equals(avdef))
                 {
@@ -210,10 +209,8 @@ public class VarDeclarationEmitter extends JSSubEmitter 
implements
                 if (avnode instanceof INumericLiteralNode)
                 {
                     INumericLiteralNode numericLiteral = (INumericLiteralNode) 
avnode;
-                    if 
(!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType()))
-                    {
-                        needsCoercion = true;
-                    }
+                    INumericLiteralNode.INumericValue numericValue = 
numericLiteral.getNumericValue();
+                    coercedValue = Long.toString(numericValue.toUint32());
                 }
                 else 
if(!getProject().getBuiltinType(BuiltinType.UINT).equals(avdef))
                 {
@@ -239,7 +236,16 @@ public class VarDeclarationEmitter extends JSSubEmitter 
implements
                        {
                 write(coercionStart);
             }
-            fjs.emitAssignedValue(avnode);
+            if (coercedValue != null)
+            {
+                startMapping(avnode);
+                write(coercedValue);
+                endMapping(avnode);
+            }
+            else
+            {
+                fjs.emitAssignedValue(avnode);
+            }
                        if (coercionStart != null)
                        {
                                if (coercionEnd != null)
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
index 3e660a8..c575b74 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
@@ -37,6 +37,7 @@ import org.apache.royale.compiler.tree.as.IFileNode;
 import org.apache.royale.compiler.tree.as.IFunctionCallNode;
 import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
+import org.apache.royale.compiler.tree.as.IReturnNode;
 import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -297,7 +298,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     {
         IBinaryOperatorNode node = getBinaryNode("var numToInt:int;numToInt = 
123.4");
         asBlockWalker.visitBinaryOperator(node);
-        assertOut("numToInt = (123.4) >> 0");
+        assertOut("numToInt = 123");
     }
 
     @Test
@@ -309,6 +310,14 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     }
 
     @Test
+    public void testVisitBinaryOperatorNode_AssignmentNegativeIntLiteralToInt()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var numToInt:int;numToInt = 
-321");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("numToInt = -321");
+    }
+
+    @Test
     public void testVisitBinaryOperatorNode_AssignmentUintVarToUint()
     {
         IBinaryOperatorNode node = getBinaryNode("var 
unsigned_integer1:uint;var unsigned_integer2:uint;unsigned_integer1 = 
unsigned_integer2");
@@ -337,7 +346,15 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     {
         IBinaryOperatorNode node = getBinaryNode("var numToUint:uint;numToUint 
= 123.4");
         asBlockWalker.visitBinaryOperator(node);
-        assertOut("numToUint = (123.4) >>> 0");
+        assertOut("numToUint = 123");
+    }
+
+    @Test
+    public void 
testVisitBinaryOperatorNode_AssignmentNegativeIntLiteralToUint()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var numToUint:uint;numToUint 
= -123");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("numToUint = 4294967173");
     }
 
     @Test
@@ -1500,6 +1517,30 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         assertOut("new Fn(\"a\", \"b\", \"return a + b;\")(1, 2)");
     }
 
+    @Test
+    public void testVisitReturnIntWithDecimalValue()
+    {
+        IReturnNode node = (IReturnNode) getNode("function():int { return 
-123.4; }", IReturnNode.class);
+        asBlockWalker.visitReturn(node);
+        assertOut("return -123");
+    }
+
+    @Test
+    public void testVisitReturnUintWithDecimalValue()
+    {
+        IReturnNode node = (IReturnNode) getNode("function():uint { return 
123.4; }", IReturnNode.class);
+        asBlockWalker.visitReturn(node);
+        assertOut("return 123");
+    }
+
+    @Test
+    public void testVisitReturnUintWithNegativeValue()
+    {
+        IReturnNode node = (IReturnNode) getNode("function():uint { return 
-123; }", IReturnNode.class);
+        asBlockWalker.visitReturn(node);
+        assertOut("return 4294967173");
+    }
+
     protected IBackend createBackend()
     {
         return new RoyaleBackend();
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
index f1bea4f..b8be801 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleFieldMembers.java
@@ -82,6 +82,30 @@ public class TestRoyaleFieldMembers extends 
TestGoogFieldMembers
     }
 
     @Test
+    public void testField_withTypeValue_IntDecimal()
+    {
+        IVariableNode node = getField("var foo:int = -123.4;");
+        asBlockWalker.visitVariable(node);
+        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = -123");
+    }
+
+    @Test
+    public void testField_withTypeValue_UintDecimal()
+    {
+        IVariableNode node = getField("var foo:uint = 123.4;");
+        asBlockWalker.visitVariable(node);
+        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 123");
+    }
+
+    @Test
+    public void testField_withTypeValue_UintNegative()
+    {
+        IVariableNode node = getField("var foo:uint = -123;");
+        asBlockWalker.visitVariable(node);
+        assertOut("/**\n * @export\n * @type {number}\n 
*/\nRoyaleTest_A.prototype.foo = 4294967173");
+    }
+
+    @Test
     public void testVariable_withTypeValue_ArrayElementType()
     {
         IVariableNode node = (IVariableNode)getNode("public class A { function 
foobar():void {var foo:Number = bar[0];var 
bar:B;}}\n[ArrayElementType(\"Number\")]\nclass B {}",
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
index 2f82899..a51da05 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
@@ -102,7 +102,7 @@ public class TestRoyaleStatements extends TestGoogStatements
         IVariableNode node = (IVariableNode) getNode("var a:int = 123.4;",
                 IVariableNode.class);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {number} */ a = (123.4) >> 0");
+        assertOut("var /** @type {number} */ a = 123");
     }
 
     @Test
@@ -111,7 +111,16 @@ public class TestRoyaleStatements extends 
TestGoogStatements
         IVariableNode node = (IVariableNode) getNode("var a:uint = 123.4;",
                 IVariableNode.class);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {number} */ a = (123.4) >>> 0");
+        assertOut("var /** @type {number} */ a = 123");
+    }
+
+    @Test
+    public void testVarDeclaration_withTypeUintAndAssignedNegative()
+    {
+        IVariableNode node = (IVariableNode) getNode("var a:uint = -123;",
+                IVariableNode.class);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {number} */ a = 4294967173");
     }
 
     //----------------------------------
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java
index 72beed5..98978db 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapExpressions.java
@@ -199,6 +199,36 @@ public class TestSourceMapExpressions extends 
SourceMapTestBase
         assertMapping(node, 0, 4, 0, 4, 0, 5); // b
     }
 
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentLiteral()
+    {
+        IBinaryOperatorNode node = getBinaryNode("a = 123.2");
+        asBlockWalker.visitBinaryOperator(node);
+        assertMapping(node, 0, 0, 0, 0, 0, 1); // a
+        assertMapping(node, 0, 1, 0, 1, 0, 4); // =
+        assertMapping(node, 0, 4, 0, 4, 0, 9); // 123.2
+    }
+
+    @Test
+    public void 
testVisitBinaryOperatorNode_AssignmentLiteralWithCompileTimeIntCoercion()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:int;a = 123.2");
+        asBlockWalker.visitBinaryOperator(node);
+        assertMapping(node, 0, 0, 0, 0, 0, 1); // a
+        assertMapping(node, 0, 1, 0, 1, 0, 4); // =
+        assertMapping(node, 0, 4, 0, 4, 0, 7); // 123
+    }
+
+    @Test
+    public void 
testVisitBinaryOperatorNode_AssignmentLiteralWithCompileTimeUintCoercion()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var a:uint;a = -123");
+        asBlockWalker.visitBinaryOperator(node);
+        assertMapping(node, 0, 0, 0, 0, 0, 1); // a
+        assertMapping(node, 0, 1, 0, 1, 0, 4); // =
+        assertMapping(node, 0, 4, 0, 4, 0, 14); // 4294967173
+    }
+
     //----------------------------------
     // Bitwise
     //----------------------------------

Reply via email to