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 afb00e4  compiler-jx: Assigning a value to an int or uint coerces it 
so that variables don't store decimal values (closes #74)
afb00e4 is described below

commit afb00e48c74476618811bfb37cc830e78e700753
Author: Josh Tynjala <[email protected]>
AuthorDate: Mon Jan 28 15:18:56 2019 -0800

    compiler-jx: Assigning a value to an int or uint coerces it so that 
variables don't store decimal values (closes #74)
    
    Applies to variable declarations, the assignment binary operator, returning 
a value from a function, and passing an argument to a function.
    
    In the case of return statements and parameters, I included some other 
basic coercions to make it more consistent with what was already there for 
variable declarations and assignment. There was some coercion related to 
dynamic array access and XML that should probably also be shared, but I left 
that out for now because those ones in particular could use some cleanup. The 
new return statements and parameters currently call a shared 
IJSEmitter.emitAssignmentCoercion(). Ideally, all four [...]
---
 .../royale/compiler/codegen/js/IJSEmitter.java     |   3 +
 .../compiler/internal/codegen/js/JSEmitter.java    |  87 ++++++++++++
 .../codegen/js/jx/BinaryOperatorEmitter.java       | 116 ++++++++++++----
 .../js/jx/FunctionCallArgumentsEmitter.java        |  29 +++-
 .../internal/codegen/js/jx/ReturnEmitter.java      |  14 +-
 .../codegen/js/jx/VarDeclarationEmitter.java       |  86 ++++++++++--
 .../codegen/js/goog/TestGoogAccessorMembers.java   |   4 +-
 .../internal/codegen/js/goog/TestGoogEmitter.java  |   2 +-
 .../codegen/js/royale/TestRoyaleClass.java         |  36 +++++
 .../codegen/js/royale/TestRoyaleEmitter.java       |   2 +-
 .../codegen/js/royale/TestRoyaleExpressions.java   | 152 +++++++++++++++------
 .../codegen/js/royale/TestRoyaleGlobalClasses.java |  10 +-
 .../js/royale/TestRoyaleGlobalFunctions.java       |   4 +-
 .../codegen/js/royale/TestRoyaleMethodMembers.java |   4 +-
 .../codegen/js/royale/TestRoyaleStatements.java    |  18 +++
 15 files changed, 473 insertions(+), 94 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java
index 5dffb4d..b68f9f0 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IJSEmitter.java
@@ -25,6 +25,7 @@ import org.apache.royale.compiler.codegen.as.IASEmitter;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.internal.codegen.js.JSSessionModel;
 import org.apache.royale.compiler.tree.as.IASNode;
+import org.apache.royale.compiler.tree.as.IExpressionNode;
 import org.apache.royale.compiler.tree.as.ITypeNode;
 import org.apache.royale.compiler.visitor.IASNodeStrategy;
 
@@ -45,4 +46,6 @@ public interface IJSEmitter extends IASEmitter, 
IMappingEmitter
     
     void emitClosureStart();
     void emitClosureEnd(IASNode node, IDefinition nodeDef);
+
+    void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition 
definition);
 }
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 6b2b8e2..997c562 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
@@ -28,6 +28,7 @@ import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
 import org.apache.royale.compiler.codegen.js.IMappingEmitter;
 import org.apache.royale.compiler.common.ISourceLocation;
+import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitter;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
@@ -58,11 +59,13 @@ import 
org.apache.royale.compiler.internal.codegen.js.jx.UnaryOperatorEmitter;
 import org.apache.royale.compiler.internal.codegen.js.jx.WhileLoopEmitter;
 import org.apache.royale.compiler.internal.codegen.js.jx.WithEmitter;
 import org.apache.royale.compiler.internal.tree.as.FunctionNode;
+import org.apache.royale.compiler.projects.ICompilerProject;
 import org.apache.royale.compiler.tree.as.IASNode;
 import org.apache.royale.compiler.tree.as.ICatchNode;
 import org.apache.royale.compiler.tree.as.IContainerNode;
 import org.apache.royale.compiler.tree.as.IDefinitionNode;
 import org.apache.royale.compiler.tree.as.IDynamicAccessNode;
+import org.apache.royale.compiler.tree.as.IExpressionNode;
 import org.apache.royale.compiler.tree.as.IForLoopNode;
 import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.compiler.tree.as.IFunctionObjectNode;
@@ -515,4 +518,88 @@ public class JSEmitter extends ASEmitter implements 
IJSEmitter
                return className.replace(".", "_") + "_" + name;
        }
 
+    public void emitAssignmentCoercion(IExpressionNode assignedNode, 
IDefinition definition)
+    {
+        IDefinition assignedDef = null;
+        ICompilerProject project = getWalker().getProject();
+        if (assignedNode != null)
+        {
+            assignedDef = assignedNode.resolveType(project);
+        }
+               String coercionStart = null;
+        String coercionEnd = null;
+               if (project.getBuiltinType(BuiltinType.INT).equals(definition))
+               {
+                       boolean needsCoercion = false;
+                       if (assignedNode instanceof INumericLiteralNode)
+                       {
+                               INumericLiteralNode numericLiteral = 
(INumericLiteralNode) assignedNode;
+                               if 
(!BuiltinType.INT.equals(numericLiteral.getNumericValue().getAssumedType()))
+                               {
+                                       needsCoercion = true;
+                               }
+                       }
+                       else 
if(!project.getBuiltinType(BuiltinType.INT).equals(assignedDef))
+                       {
+                               needsCoercion = true;
+                       }
+                       if (needsCoercion)
+                       {
+                               coercionStart = "(";
+                               coercionEnd = ") >> 0";
+                       }
+               }
+               else if 
(project.getBuiltinType(BuiltinType.UINT).equals(definition))
+               {
+                       boolean needsCoercion = false;
+                       if (assignedNode instanceof INumericLiteralNode)
+                       {
+                               INumericLiteralNode numericLiteral = 
(INumericLiteralNode) assignedNode;
+                               if 
(!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType()))
+                               {
+                                       needsCoercion = true;
+                               }
+                       }
+                       else 
if(!project.getBuiltinType(BuiltinType.UINT).equals(assignedDef))
+                       {
+                               needsCoercion = true;
+                       }
+                       if (needsCoercion)
+                       {
+                               coercionStart = "(";
+                               coercionEnd = ") >>> 0";
+            }
+        }
+        else if (project.getBuiltinType(BuiltinType.NUMBER).equals(definition)
+                && 
!project.getBuiltinType(BuiltinType.NUMBER).equals(assignedDef)
+                && !project.getBuiltinType(BuiltinType.INT).equals(assignedDef)
+                && 
!project.getBuiltinType(BuiltinType.UINT).equals(assignedDef))
+        {
+            coercionStart = "Number(";
+        }
+        else if (project.getBuiltinType(BuiltinType.STRING).equals(definition)
+                && 
!project.getBuiltinType(BuiltinType.STRING).equals(assignedDef)
+                && 
!project.getBuiltinType(BuiltinType.NULL).equals(assignedDef))
+        {
+            coercionStart = "org.apache.royale.utils.Language.string(";
+        }
+
+               if (coercionStart != null)
+               {
+                       write(coercionStart);
+               }
+               getWalker().walk(assignedNode);
+               if (coercionStart != null)
+               {
+                       if (coercionEnd != null)
+                       {
+                               write(coercionEnd);
+                       }
+                       else
+                       {
+                               write(")");
+                       }
+               }
+    }
+
 }
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 756c3d8..ff09dd4 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
@@ -22,6 +22,7 @@ package org.apache.royale.compiler.internal.codegen.js.jx;
 import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
+import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.ITypeDefinition;
 import org.apache.royale.compiler.definitions.metadata.IMetaTag;
@@ -45,6 +46,7 @@ import org.apache.royale.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.royale.compiler.tree.as.IClassNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
 import org.apache.royale.compiler.tree.as.IIdentifierNode;
+import org.apache.royale.compiler.tree.as.INumericLiteralNode;
 import org.apache.royale.compiler.utils.ASNodeUtils;
 
 public class BinaryOperatorEmitter extends JSSubEmitter implements
@@ -444,32 +446,91 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
                                }
                        }
             }
-            String coercion = (leftIsNumber && !rightIsNumber && isAssignment) 
? "Number(" : "";
-            if (isAssignment && leftDef != null && 
leftDef.getQualifiedName().equals(IASLanguageConstants.String))
+                       String coercionStart = null;
+                       String coercionEnd = null;
+            if (isAssignment)
             {
-               if (rNode.getNodeID() != ASTNodeID.LiteralStringID &&
-                               rNode.getNodeID() != ASTNodeID.LiteralNullID)
-               {
-                               if (rightDef == null ||
-                                               
(!(rightDef.getQualifiedName().equals(IASLanguageConstants.String) ||
-                                                 
(rightDef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE)
-                                               && rNode.getNodeID() == 
ASTNodeID.FunctionCallID &&
-                                               isToString(rNode)) ||
-                                                 // if not an assignment we 
don't need to coerce numbers
-                                                 (!isAssignment && 
rightIsNumber) ||
-                                                  
rightDef.getQualifiedName().equals(IASLanguageConstants.Null))))
-                               {
-                                       JSRoyaleDocEmitter docEmitter = 
(JSRoyaleDocEmitter)(getEmitter().getDocEmitter());
-                                       if (docEmitter.emitStringConversions)
-                                       {
-                                               coercion = 
"org.apache.royale.utils.Language.string(";
-                                       }
-                               }
-               }
+                               if 
(getProject().getBuiltinType(BuiltinType.INT).equals(leftDef))
+                               {
+                                       boolean needsCoercion = false;
+                                       if (rNode instanceof 
INumericLiteralNode)
+                                       {
+                                               INumericLiteralNode rNumber = 
(INumericLiteralNode) rNode;
+                                               if 
(!BuiltinType.INT.equals(rNumber.getNumericValue().getAssumedType()))
+                                               {
+                                                       needsCoercion = true;
+                                               }
+                                       }
+                                       else 
if(!getProject().getBuiltinType(BuiltinType.INT).equals(rightDef))
+                                       {
+                                               needsCoercion = true;
+                                       }
+                                       if (needsCoercion)
+                                       {
+                                               coercionStart = "(";
+                                               coercionEnd = ") >> 0";
+                                       }
+                               }
+                               else if 
(getProject().getBuiltinType(BuiltinType.UINT).equals(leftDef))
+                               {
+                                       boolean needsCoercion = false;
+                                       if (rNode instanceof 
INumericLiteralNode)
+                                       {
+                                               INumericLiteralNode rNumber = 
(INumericLiteralNode) rNode;
+                                               if 
(!BuiltinType.UINT.equals(rNumber.getNumericValue().getAssumedType()))
+                                               {
+                                                       needsCoercion = true;
+                                               }
+                                       }
+                                       else 
if(!getProject().getBuiltinType(BuiltinType.UINT).equals(rightDef))
+                                       {
+                                               needsCoercion = true;
+                                       }
+                                       if (needsCoercion)
+                                       {
+                                               coercionStart = "(";
+                                               coercionEnd = ") >>> 0";
+                                       }
+                               }
+                               else if (leftIsNumber && !rightIsNumber)
+                               {
+                                       coercionStart = "Number(";
+                               }
+                               else if 
(getProject().getBuiltinType(BuiltinType.STRING).equals(leftDef))
+                               {
+                                       if (rNode.getNodeID() != 
ASTNodeID.LiteralStringID &&
+                                                       rNode.getNodeID() != 
ASTNodeID.LiteralNullID)
+                                       {
+                                               if (rightDef == null ||
+                                                               
(!(rightDef.getQualifiedName().equals(IASLanguageConstants.String) ||
+                                                               
(rightDef.getQualifiedName().equals(IASLanguageConstants.ANY_TYPE)
+                                                                               
&& rNode.getNodeID() == ASTNodeID.FunctionCallID &&
+                                                                               
isToString(rNode)) ||
+                                                               // if not an 
assignment we don't need to coerce numbers
+                                                               (!isAssignment 
&& rightIsNumber) ||
+                                                               
rightDef.getQualifiedName().equals(IASLanguageConstants.Null))))
+                                               {
+                                                       JSRoyaleDocEmitter 
docEmitter = (JSRoyaleDocEmitter)(getEmitter().getDocEmitter());
+                                                       if 
(docEmitter.emitStringConversions)
+                                                       {
+                                                               coercionStart = 
"org.apache.royale.utils.Language.string(";
+                                                       }
+                                               }
+                                       }
+                               }
             }
-            super_emitBinaryOperator(node, coercion);
-            if (coercion.length() > 0)
-               write(")");
+            super_emitBinaryOperator(node, coercionStart);
+                       if (coercionStart != null)
+                       {
+                               if (coercionEnd != null)
+                               {
+                                       write(coercionEnd);
+                               }
+                               else
+                               {
+                                       write(")");
+                               }
+                       }
                
             /*
             IExpressionNode leftSide = node.getLeftOperandNode();
@@ -550,7 +611,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
        return false;
     }
 
-    private void super_emitBinaryOperator(IBinaryOperatorNode node, String 
coercion)
+    private void super_emitBinaryOperator(IBinaryOperatorNode node, String 
coercionStart)
     {
         if (ASNodeUtils.hasParenOpen(node))
             write(ASEmitterTokens.PAREN_OPEN);
@@ -617,7 +678,10 @@ public class BinaryOperatorEmitter extends JSSubEmitter 
implements
             write(ASEmitterTokens.SPACE);
             endMapping(node);
 
-            write(coercion);
+                       if (coercionStart != null)
+                       {
+                               write(coercionStart);
+                       }
             /*
             IDefinition definition = 
node.getRightOperandNode().resolve(getProject());
                if (definition instanceof FunctionDefinition &&
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
index bca4c59..40b6302 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
@@ -21,10 +21,14 @@ package org.apache.royale.compiler.internal.codegen.js.jx;
 
 import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
+import org.apache.royale.compiler.definitions.IDefinition;
+import org.apache.royale.compiler.definitions.IFunctionDefinition;
+import org.apache.royale.compiler.definitions.IParameterDefinition;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter;
 import org.apache.royale.compiler.tree.as.IContainerNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
+import org.apache.royale.compiler.tree.as.IFunctionCallNode;
 
 public class FunctionCallArgumentsEmitter extends JSSubEmitter implements
         ISubEmitter<IContainerNode>
@@ -41,11 +45,34 @@ public class FunctionCallArgumentsEmitter extends 
JSSubEmitter implements
         write(ASEmitterTokens.PAREN_OPEN);
         endMapping(node);
 
+        IParameterDefinition[] paramDefs = null;
+        IFunctionCallNode functionCallNode = (IFunctionCallNode) 
node.getAncestorOfType(IFunctionCallNode.class);
+        if (functionCallNode != null)
+        {
+            IDefinition calledDef = 
functionCallNode.resolveCalledExpression(getProject());
+            if (calledDef instanceof IFunctionDefinition)
+            {
+                IFunctionDefinition functionDef = (IFunctionDefinition) 
calledDef;
+                paramDefs = functionDef.getParameters();
+            }
+        }
+
         int len = node.getChildCount();
         for (int i = 0; i < len; i++)
         {
             IExpressionNode argumentNode = (IExpressionNode) node.getChild(i);
-            getWalker().walk(argumentNode);
+            IParameterDefinition paramDef = null;
+            if (paramDefs != null && paramDefs.length > i)
+            {
+                paramDef = paramDefs[i];
+                if (paramDef.isRest())
+                {
+                    paramDef = null;
+                }
+            }
+
+            getEmitter().emitAssignmentCoercion(argumentNode, paramDef);
+
             if (i < len - 1)
             {
                 //we're mapping the comma to the container, but we use the
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java
index a7f5d7e..0573110 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ReturnEmitter.java
@@ -21,10 +21,12 @@ package org.apache.royale.compiler.internal.codegen.js.jx;
 
 import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
+import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter;
 import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
+import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.compiler.tree.as.IReturnNode;
 
 public class ReturnEmitter extends JSSubEmitter implements
@@ -51,7 +53,17 @@ public class ReturnEmitter extends JSSubEmitter implements
 
         if (hasReturnValue)
         {
-            getWalker().walk(rnode);
+            IDefinition returnDef = null;
+            IFunctionNode parentFn = (IFunctionNode) 
node.getAncestorOfType(IFunctionNode.class);
+            if (parentFn != null)
+            {
+                IExpressionNode returnTypeNode = parentFn.getReturnTypeNode();
+                if (returnTypeNode != null)
+                {
+                    returnDef = returnTypeNode.resolve(getProject());
+                }
+            }
+            getEmitter().emitAssignmentCoercion(rnode, returnDef);
         }
     }
 }
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 90dbd7b..01c4a6f 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
@@ -23,6 +23,7 @@ import org.apache.royale.compiler.codegen.ISubEmitter;
 import org.apache.royale.compiler.codegen.js.IJSEmitter;
 import org.apache.royale.compiler.constants.IASKeywordConstants;
 import org.apache.royale.compiler.constants.IASLanguageConstants;
+import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType;
 import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.definitions.metadata.IMetaTag;
 import org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute;
@@ -40,6 +41,7 @@ import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.IASNode;
 import org.apache.royale.compiler.tree.as.IEmbedNode;
 import org.apache.royale.compiler.tree.as.IExpressionNode;
+import org.apache.royale.compiler.tree.as.INumericLiteralNode;
 import org.apache.royale.compiler.tree.as.IVariableNode;
 
 public class VarDeclarationEmitter extends JSSubEmitter implements
@@ -65,9 +67,11 @@ public class VarDeclarationEmitter extends JSSubEmitter 
implements
         }
 
         IExpressionNode variableTypeNode = node.getVariableTypeNode();
+        IDefinition variableDef = null;
         boolean hasVariableType = variableTypeNode.getLine() >= 0;
         if(hasVariableType)
         {
+            variableDef = variableTypeNode.resolve(getProject());
             startMapping(variableTypeNode,
                     variableTypeNode.getLine(),
                     variableTypeNode.getColumn() - 1); //include the :
@@ -173,20 +177,76 @@ public class VarDeclarationEmitter extends JSSubEmitter 
implements
                                }
                        }
             }
-            String coercion = "";
-            if (varIsNumber && !valIsNumber)
-               coercion = "Number(";
-            //else if (varIsNumber && valIsNumber && varIsInt && !valIsInt)
-            // coercion = "Math.floor(";
-            if (variableTypeNode.getNodeID() == ASTNodeID.IdentifierID &&
-                       
((IdentifierNode)variableTypeNode).getName().equals(IASLanguageConstants.String)
 &&
-                       (avdef == null || 
(!avdef.getQualifiedName().equals(IASLanguageConstants.String) &&
-                                                   
!avdef.getQualifiedName().equals(IASLanguageConstants.Null))))
-                       coercion = "org.apache.royale.utils.Language.string(";
-            write(coercion);
+            String coercionStart = null;
+            String coercionEnd = 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;
+                    }
+                }
+                else 
if(!getProject().getBuiltinType(BuiltinType.INT).equals(avdef))
+                {
+                    needsCoercion = true;
+                }
+                if (needsCoercion)
+                {
+                    coercionStart = "(";
+                    coercionEnd = ") >> 0";
+                }
+            }
+            else if 
(getProject().getBuiltinType(BuiltinType.UINT).equals(variableDef))
+            {
+                boolean needsCoercion = false;
+                if (avnode instanceof INumericLiteralNode)
+                {
+                    INumericLiteralNode numericLiteral = (INumericLiteralNode) 
avnode;
+                    if 
(!BuiltinType.UINT.equals(numericLiteral.getNumericValue().getAssumedType()))
+                    {
+                        needsCoercion = true;
+                    }
+                }
+                else 
if(!getProject().getBuiltinType(BuiltinType.UINT).equals(avdef))
+                {
+                    needsCoercion = true;
+                }
+                if (needsCoercion)
+                {
+                    coercionStart = "(";
+                    coercionEnd = ") >>> 0";
+                }
+            }
+            else if (varIsNumber && !valIsNumber)
+            {
+                coercionStart = "Number(";
+            }
+            else if 
(getProject().getBuiltinType(BuiltinType.STRING).equals(variableDef) &&
+                !getProject().getBuiltinType(BuiltinType.STRING).equals(avdef) 
&&
+                !getProject().getBuiltinType(BuiltinType.NULL).equals(avdef))
+            {
+                coercionStart = "org.apache.royale.utils.Language.string(";
+            }
+                       if (coercionStart != null)
+                       {
+                write(coercionStart);
+            }
             fjs.emitAssignedValue(avnode);
-            if (coercion.length() > 0)
-               write(")");
+                       if (coercionStart != null)
+                       {
+                               if (coercionEnd != null)
+                               {
+                                       write(coercionEnd);
+                               }
+                               else
+                               {
+                                       write(")");
+                               }
+                       }
         }
         if (avnode == null)
         {
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
index 3fd051d..69ae550 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
@@ -98,10 +98,10 @@ public class TestGoogAccessorMembers extends 
TestAccessorMembers
     @Test
     public void testSetAccessor_withBody()
     {
-        ISetterNode node = (ISetterNode) getAccessor("function set 
foo(value:int):void{trace('haai');}");
+        ISetterNode node = (ISetterNode) getAccessor("function set 
foo(value:int):void{'haai';}");
         asBlockWalker.visitSetter(node);
         assertOut("Object.defineProperty(\n\tRoyaleTest_A.prototype, 
\n\t'foo', "
-                + "\n\t{set:function(value) {\n\t\tvar self = 
this;\n\t\ttrace('haai');\n\t}, configurable:true}\n)");
+                + "\n\t{set:function(value) {\n\t\tvar self = 
this;\n\t\t'haai';\n\t}, configurable:true}\n)");
     }
 
     @Override
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java
index 6fe906d..c40adb9 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogEmitter.java
@@ -111,7 +111,7 @@ public class TestGoogEmitter extends ASTestBase
     @Test
     public void testDefaultParameter()
     {
-        IFunctionNode node = getMethodWithPackage("function method1(p1:int, 
p2:int, p3:int = 3, p4:int = 4):int{return p1 + p2 + p3 + p4;}");
+        IFunctionNode node = getMethodWithPackage("function method1(p1:Number, 
p2:Number, p3:Number = 3, p4:Number = 4):Number{return p1 + p2 + p3 + p4;}");
         asBlockWalker.visitFunction(node);
         assertOut("/**\n * @param {number} p1\n * @param {number} p2\n * 
@param {number=} p3\n * @param {number=} p4\n * @return {number}\n */\n"
                 + "foo.bar.RoyaleTest_A.prototype.method1 = function(p1, p2, 
p3, p4) {\n"
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
index f496a4e..ecc034a 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleClass.java
@@ -149,6 +149,42 @@ public class TestRoyaleClass extends TestGoogClass
     }
 
     @Test
+    public void testMethod_returnInt()
+    {
+        IClassNode node = getClassNode("public class B {public function B() 
{}; public function foo():int { var a:Number = 123.4; return a; };}");
+        asBlockWalker.visitClass(node);
+        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = 
function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for 
reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', 
org.apache.royale.B);\n\n\n/**\n * @export\n 
*/\norg.apache.royale.B.prototype.foo = function() {\n  var a /** @type 
{number} */ = 123.4;\n  return (a) >> 0;\n};";
+        assertOut(expected);
+    }
+
+    @Test
+    public void testMethod_returnIntLiteral()
+    {
+        IClassNode node = getClassNode("public class B {public function B() 
{}; public function foo():int { return 123.4 };}");
+        asBlockWalker.visitClass(node);
+        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = 
function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for 
reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', 
org.apache.royale.B);\n\n\n/**\n * @export\n 
*/\norg.apache.royale.B.prototype.foo = function() {\n  return (123.4) >> 
0;\n};";
+        assertOut(expected);
+    }
+
+    @Test
+    public void testMethod_returnUint()
+    {
+        IClassNode node = getClassNode("public class B {public function B() 
{}; public function foo():uint { var a:Number = 123.4; return a; };}");
+        asBlockWalker.visitClass(node);
+        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = 
function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for 
reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', 
org.apache.royale.B);\n\n\n/**\n * @export\n 
*/\norg.apache.royale.B.prototype.foo = function() {\n  var a /** @type 
{number} */ = 123.4;\n  return (a) >>> 0;\n};";
+        assertOut(expected);
+    }
+
+    @Test
+    public void testMethod_returnUintLiteral()
+    {
+        IClassNode node = getClassNode("public class B {public function B() 
{}; public function foo():uint { return 123.4 };}");
+        asBlockWalker.visitClass(node);
+        String expected = "/**\n * @constructor\n */\norg.apache.royale.B = 
function() {\n};\n\n\n/**\n * Prevent renaming of class. Needed for 
reflection.\n */\ngoog.exportSymbol('org.apache.royale.B', 
org.apache.royale.B);\n\n\n/**\n * @export\n 
*/\norg.apache.royale.B.prototype.foo = function() {\n  return (123.4) >>> 
0;\n};";
+        assertOut(expected);
+    }
+
+    @Test
     public void testMethod_override()
     {
         IClassNode node = getClassNode("public class B {public function B() 
{}; override public function foo():void {};}");
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
index e8c40a8..25fccbb 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleEmitter.java
@@ -330,7 +330,7 @@ public class TestRoyaleEmitter extends TestGoogEmitter
     @Test
     public void testDefaultParameter()
     {
-        IFunctionNode node = getMethodWithPackage("function method1(p1:int, 
p2:int, p3:int = 3, p4:int = 4):int{return p1 + p2 + p3 + p4;}");
+        IFunctionNode node = getMethodWithPackage("function method1(p1:Number, 
p2:Number, p3:Number = 3, p4:Number = 4):Number{return p1 + p2 + p3 + p4;}");
         asBlockWalker.visitFunction(node);
         assertOut("/**\n * @param {number} p1\n * @param {number} p2\n * 
@param {number=} p3\n * @param {number=} p4\n * @return {number}\n */\n"
                 + "foo.bar.RoyaleTest_A.prototype.method1 = function(p1, p2, 
p3, p4) {\n"
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 713c26f..7aeb0f6 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
@@ -269,10 +269,82 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     }
 
     @Test
+    public void testVisitBinaryOperatorNode_AssignmentIntVarToInt()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var integer1:int;var 
integer2:int;integer1 = integer2");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("integer1 = integer2");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentNumberVarToInt()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var integer:int;var 
number:Number;integer = number");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("integer = (number) >> 0");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentUintVarToInt()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var integer:int;var 
unsigned_integer:uint;integer = unsigned_integer");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("integer = (unsigned_integer) >> 0");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentNumberLiteralToInt()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var numToInt:int;numToInt = 
123.4");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("numToInt = (123.4) >> 0");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentIntLiteralToInt()
+    {
+        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");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("unsigned_integer1 = unsigned_integer2");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentNumberVarToUint()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var 
unsigned_integer:uint;var number:Number;unsigned_integer = number");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("unsigned_integer = (number) >>> 0");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentIntVarToUint()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var 
unsigned_integer:uint;var integer:int;unsigned_integer = integer");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("unsigned_integer = (integer) >>> 0");
+    }
+
+    @Test
+    public void testVisitBinaryOperatorNode_AssignmentNumberLiteralToUint()
+    {
+        IBinaryOperatorNode node = getBinaryNode("var numToUint:uint;numToUint 
= 123.4");
+        asBlockWalker.visitBinaryOperator(node);
+        assertOut("numToUint = (123.4) >>> 0");
+    }
+
+    @Test
     public void testVisitBinaryOperatorNode_setterAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c() { b = 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c() { b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -282,7 +354,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_setterAssignmentWithThis()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c() { this.b = 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c() { this.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -292,7 +364,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_setterAssignmentPrivate()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function get b():int { return 0; } 
private function set b(value:int):void {}; public function test() { this.b = 1; 
}}",
+                "public class B {public function get b():Number { return 0; } 
private function set b(value:Number):void {}; public function test() { this.b = 
1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -302,7 +374,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_setterAssignmentPrivateWithNamespace()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function get b():int { return 0; } 
private function set b(value:int):void {}; public function test() { 
this.private::b = 1; }}",
+                "public class B {public function get b():Number { return 0; } 
private function set b(value:Number):void {}; public function test() { 
this.private::b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -316,7 +388,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         // disconnect fileNode from parent
         // set thisclass on emitter to class def
         IFileNode node = (IFileNode) getNode(
-                "public class B { public function c() { this.b = 1; }; public 
function set b(value:int):void {}}",
+                "public class B { public function c() { this.b = 1; }; public 
function set b(value:Number):void {}}",
                 IFileNode.class, WRAP_LEVEL_PACKAGE, true);
         IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
                 node, IFunctionNode.class);
@@ -340,7 +412,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         // disconnect fileNode from parent
         // set thisclass on emitter to class def
         IFileNode node = (IFileNode) getNode(
-                "public class B { public function c() { b = 1; }; public 
function set b(value:int):void {}}",
+                "public class B { public function c() { b = 1; }; public 
function set b(value:Number):void {}}",
                 IFileNode.class, WRAP_LEVEL_PACKAGE, true);
         IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
                 node, IFunctionNode.class);
@@ -360,7 +432,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_setterAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c(other:B) { other.b = 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c(other:B) { other.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.b = 1");
@@ -370,7 +442,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_nestedSetterAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function get d():B {}; public function c(other:B) { d.d.b = 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function get d():B {}; public function c(other:B) { d.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.d.d.b = 1");
@@ -380,7 +452,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_nestedSetterAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function get d():B {}; public function c(other:B) { other.d.b = 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function get d():B {}; public function c(other:B) { other.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.d.b = 1");
@@ -390,7 +462,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_setterAssignmentFromGetter()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c() { b = b + 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c() { b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = this.b + 1");
@@ -400,7 +472,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_setterAssignmentFromGetterMaskedByLocal()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c() { var b:int; b = b + 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c() { var b:Number; b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -410,7 +482,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_setterAssignmentFromGetterMaskedByParam()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public function set b(value:int):void {}; 
public function c(b:int) { b = b + 1; }}",
+                "public class B {public function set b(value:Number):void {}; 
public function c(b:Number) { b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -420,7 +492,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_setterAssignmentFromInternalVar()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {var b:int; public function c() { b = b + 1; 
}}",
+                "public class B {var b:Number; public function c() { b = b + 
1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = this.b + 1");
@@ -430,7 +502,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_staticSetterAssignmentFromInternalVar()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {static var b:int; public function c() { b = b 
+ 1; }}",
+                "public class B {static var b:Number; public function c() { b 
= b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("B.b = B.b + 1");
@@ -440,7 +512,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_bindableAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c() { b = 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c() { b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -450,7 +522,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_bindableAssignmentWithThis()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c() { this.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c() { this.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -460,7 +532,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_bindableAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c(other:B) { other.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c(other:B) { other.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.b = 1");
@@ -470,7 +542,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_bindableSetterAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; [Bindable] 
public var d:B; public function c(other:B) { d.d.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; [Bindable] 
public var d:B; public function c(other:B) { d.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.d.d.b = 1");
@@ -480,7 +552,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_bindableSetterAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; [Bindable] 
public var d:B; public function c(other:B) { other.d.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; [Bindable] 
public var d:B; public function c(other:B) { other.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.d.b = 1");
@@ -490,7 +562,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_bindableAssignmentFromGetter()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c() { b = b + 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c() { b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = this.b + 1");
@@ -500,7 +572,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_bindableAssignmentFromGetterMaskedByLocal()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c() { var b:int; b = b + 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c() { var b:Number; b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -510,7 +582,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_bindableAssignmentFromGetterMaskedByParam()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public function 
c(b:int) { b = b + 1; }}",
+                "public class B {[Bindable] public var b:Number; public 
function c(b:Number) { b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -520,7 +592,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c() { b = 
1; }}",
+                "public class B {public var b:Number; public function c() { b 
= 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -530,7 +602,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignmentWithThis()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c() { 
this.b = 1; }}",
+                "public class B {public var b:Number; public function c() { 
this.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = 1");
@@ -540,7 +612,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c(other:B) 
{ other.b = 1; }}",
+                "public class B {public var b:Number; public function 
c(other:B) { other.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.b = 1");
@@ -550,7 +622,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varSetterAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public var d:B; 
public function c(other:B) { d.d.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; public var 
d:B; public function c(other:B) { d.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.d.d.b = 1");
@@ -560,7 +632,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varVarAssignment()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public var d:B; public 
function c(other:B) { d.d.b = 1; }}",
+                "public class B {public var b:Number; public var d:B; public 
function c(other:B) { d.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.d.d.b = 1");
@@ -570,7 +642,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varSetterAssignmentOtherInstance()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {[Bindable] public var b:int; public var d:B; 
public function c(other:B) { other.d.b = 1; }}",
+                "public class B {[Bindable] public var b:Number; public var 
d:B; public function c(other:B) { other.d.b = 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("other.d.b = 1");
@@ -580,7 +652,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignmentFromVar()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c() { b = b 
+ 1; }}",
+                "public class B {public var b:Number; public function c() { b 
= b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("this.b = this.b + 1");
@@ -590,7 +662,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignmentFromVarMaskedByLocal()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c() { var 
b:int; b = b + 1; }}",
+                "public class B {public var b:Number; public function c() { 
var b:Number; b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -600,7 +672,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_varAssignmentFromVarMaskedByParam()
     {
         IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
-                "public class B {public var b:int; public function c(b:int) { 
b = b + 1; }}",
+                "public class B {public var b:Number; public function 
c(b:Number) { b = b + 1; }}",
                 IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
         asBlockWalker.visitBinaryOperator(node);
         assertOut("b = b + 1");
@@ -610,7 +682,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_staticSetterAssignment()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c() { b = 1; }; public static 
function set b(value:int):void {}}",
+                "public class B {public function c() { b = 1; }; public static 
function set b(value:Number):void {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -622,7 +694,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_staticSetterAssignmentWithPath()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c() { foo.bar.B.b = 1; }; 
public static function set b(value:int):void {}}",
+                "public class B {public function c() { foo.bar.B.b = 1; }; 
public static function set b(value:Number):void {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -634,7 +706,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_staticSetterAssignmentOtherInstance()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c() { d.b = 1; }; public 
function set b(value:int):void {}; public static function get d():B {}}",
+                "public class B {public function c() { d.b = 1; }; public 
function set b(value:Number):void {}; public static function get d():B {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -650,7 +722,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
         // disconnect fileNode from parent
         // set thisclass on emitter to class def
         IFileNode node = (IFileNode) getNode(
-                "public class B {public function c() { d.b = 1; }; public 
function set b(value:int):void {}; public static function get d():B {}}",
+                "public class B {public function c() { d.b = 1; }; public 
function set b(value:Number):void {}; public static function get d():B {}}",
                 IFileNode.class, WRAP_LEVEL_PACKAGE, true);
         IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
                 node, IFunctionNode.class);
@@ -670,7 +742,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testVisitBinaryOperatorNode_staticSetterAssignmentFromGetter()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c() { b = b + 1; }; public 
static function set b(value:int):void {}; public static function get b():int 
{}}",
+                "public class B {public function c() { b = b + 1; }; public 
static function set b(value:Number):void {}; public static function get 
b():Number {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -682,7 +754,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_staticSetterAssignmentFromGetterMaskedByLocal()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c() { var b:int; b = b + 1; 
}; public static function set b(value:int):void {}; public static function get 
b():int {}}",
+                "public class B {public function c() { var b:Number; b = b + 
1; }; public static function set b(value:Number):void {}; public static 
function get b():Number {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -694,7 +766,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void 
testVisitBinaryOperatorNode_staticSetterAssignmentFromGetterMaskedByParam()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function c(b:int) { b = b + 1; }; 
public static function set b(value:int):void {}; public static function get 
b():int {}}",
+                "public class B {public function c(b:Number) { b = b + 1; }; 
public static function set b(value:Number):void {}; public static function get 
b():Number {}}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) 
findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
@@ -1036,7 +1108,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testNativeGetter()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function b():int { var s:String; 
return s.length; }}",
+                "public class B {public function b():Number { var s:String; 
return s.length; }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
         // String.length is a getter but is a property in JS, so don't 
generate set_length() call.
@@ -1047,7 +1119,7 @@ public class TestRoyaleExpressions extends 
TestGoogExpressions
     public void testNativeVectorGetter()
     {
         IFunctionNode node = (IFunctionNode) getNode(
-                "public class B {public function b():int { var 
a:Vector.<String>; return a.length; }}",
+                "public class B {public function b():Number { var 
a:Vector.<String>; return a.length; }}",
                 IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitFunction(node);
         // String.length is a getter but is a property in JS, so don't 
generate set_length() call.
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
index 77d148c..f823df8 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalClasses.java
@@ -675,7 +675,7 @@ public class TestRoyaleGlobalClasses extends 
TestGoogGlobalClasses
         IASNode parentNode = node.getParent();
         node = (IVariableNode) parentNode.getChild(1);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {number} */ b = a.child('child').length()");
+        assertOut("var /** @type {number} */ b = (a.child('child').length()) 
>> 0");
     }
     
     @Test
@@ -939,7 +939,7 @@ public class TestRoyaleGlobalClasses 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("var foreachiter0_target = a;\nfor (var foreachiter0 in 
foreachiter0_target.elementNames()) \n{\nvar p = 
foreachiter0_target[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[foreachiter0];\n\n  var /** @type {number} */ i = 
(p.length()) >> 0;}\n");
     }
     
     @Test
@@ -947,7 +947,7 @@ public class TestRoyaleGlobalClasses extends 
TestGoogGlobalClasses
     {
        IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in (a 
as XMLList)) var i:int = p.length();");
         asBlockWalker.visitForLoop(node);
-        assertOut("var foreachiter0_target = 
org.apache.royale.utils.Language.as(a, XMLList);\nfor (var foreachiter0 in 
foreachiter0_target.elementNames()) \n{\nvar p = 
foreachiter0_target[foreachiter0];\n\n  var /** @type {number} */ i = 
p.length();}\n");
+        assertOut("var foreachiter0_target = 
org.apache.royale.utils.Language.as(a, XMLList);\nfor (var foreachiter0 in 
foreachiter0_target.elementNames()) \n{\nvar p = 
foreachiter0_target[foreachiter0];\n\n  var /** @type {number} */ i = 
(p.length()) >> 0;}\n");
     }
     
     @Test
@@ -955,7 +955,7 @@ public class TestRoyaleGlobalClasses extends 
TestGoogGlobalClasses
     {
        IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in 
XMLList(a)) var i:int = p.length();");
         asBlockWalker.visitForLoop(node);
-        assertOut("var foreachiter0_target = XMLList(a);\nfor (var 
foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = 
foreachiter0_target[foreachiter0];\n\n  var /** @type {number} */ i = 
p.length();}\n");
+        assertOut("var foreachiter0_target = XMLList(a);\nfor (var 
foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = 
foreachiter0_target[foreachiter0];\n\n  var /** @type {number} */ i = 
(p.length()) >> 0;}\n");
     }
     
     @Test
@@ -1074,7 +1074,7 @@ public class TestRoyaleGlobalClasses extends 
TestGoogGlobalClasses
                 "import custom.TestProxy; public class B {public function b() 
{ var a:TestProxy = new TestProxy();for each (var p:String in a) var i:int = 
p.length; }}",
                 IForLoopNode.class, WRAP_LEVEL_PACKAGE, true);
         asBlockWalker.visitForLoop(node);
-        assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in 
foreachiter0_target.propertyNames()) \n{\nvar p = 
foreachiter0_target.getProperty(foreachiter0);\n\n  var /** @type {number} */ i 
= p.length;}\n");
+        assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in 
foreachiter0_target.propertyNames()) \n{\nvar p = 
foreachiter0_target.getProperty(foreachiter0);\n\n  var /** @type {number} */ i 
= (p.length) >> 0;}\n");
     }
     
     @Test
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java
index 2c6eaf7..8f2f9d1 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleGlobalFunctions.java
@@ -104,7 +104,7 @@ public class TestRoyaleGlobalFunctions extends 
TestGoogGlobalFunctions
     @Test
     public void testParseInt()
     {
-        IVariableNode node = getVariable("var a:int = parseInt('1.8');");
+        IVariableNode node = getVariable("var a:Number = parseInt('1.8');");
         asBlockWalker.visitVariable(node);
         assertOut("var /** @type {number} */ a = parseInt('1.8', undefined)");
     }
@@ -112,7 +112,7 @@ public class TestRoyaleGlobalFunctions extends 
TestGoogGlobalFunctions
     @Test
     public void testParseIntTwoArgs()
     {
-        IVariableNode node = getVariable("var a:int = parseInt('1.8', 16);");
+        IVariableNode node = getVariable("var a:Number = parseInt('1.8', 
16);");
         asBlockWalker.visitVariable(node);
         assertOut("var /** @type {number} */ a = parseInt('1.8', 16)");
     }
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java
index dc251a3..78cdcaf 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleMethodMembers.java
@@ -147,7 +147,7 @@ public class TestRoyaleMethodMembers extends 
TestGoogMethodMembers
     {
         IClassNode node = (IClassNode) getNode("public function 
RoyaleTest_A(){}; private function foo(value:int):String{return value;}; 
private function bar():String{if(true){while(i){return this.foo(42);}}};", 
IClassNode.class, WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * @private\n * 
@param {number} value\n * @return {string}\n */\nRoyaleTest_A.prototype.foo = 
function(value) {\n  return value;\n};\n\n\n/**\n * @private\n * @return 
{string}\n */\nRoyaleTest_A.prototype.bar = function() {\n  if (true) {\n    
while (i) {\n      return this.foo(42);\n  [...]
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * @private\n * 
@param {number} value\n * @return {string}\n */\nRoyaleTest_A.prototype.foo = 
function(value) {\n  return 
org.apache.royale.utils.Language.string(value);\n};\n\n\n/**\n * @private\n * 
@return {string}\n */\nRoyaleTest_A.prototype.bar = function() {\n  if (true) 
{\n    w [...]
     }
 
     @Test
@@ -155,7 +155,7 @@ public class TestRoyaleMethodMembers extends 
TestGoogMethodMembers
     {
         IClassNode node = (IClassNode) getNode("public function 
RoyaleTest_A(){}; private function foo(value:int):String{return value;}; 
private function bar():void{if(true){while(i){foo(42);}}};", IClassNode.class, 
WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * @private\n * 
@param {number} value\n * @return {string}\n */\nRoyaleTest_A.prototype.foo = 
function(value) {\n  return value;\n};\n\n\n/**\n * @private\n 
*/\nRoyaleTest_A.prototype.bar = function() {\n  if (true) {\n    while (i) {\n 
     this.foo(42);\n    }\n  }\n};");
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() 
{\n};\n\n\n/**\n * Prevent renaming of class. Needed for reflection.\n 
*/\ngoog.exportSymbol('RoyaleTest_A', RoyaleTest_A);\n\n\n/**\n * @private\n * 
@param {number} value\n * @return {string}\n */\nRoyaleTest_A.prototype.foo = 
function(value) {\n  return 
org.apache.royale.utils.Language.string(value);\n};\n\n\n/**\n * @private\n 
*/\nRoyaleTest_A.prototype.bar = function() {\n  if (true) {\n    while (i) {\n 
     thi [...]
     }
 
     @Override
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 9de87f5..2f82899 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
@@ -96,6 +96,24 @@ public class TestRoyaleStatements extends TestGoogStatements
         assertOut("var /** @type {number} */ a = 0");
     }
 
+    @Test
+    public void testVarDeclaration_withTypeIntAndAssignedNumber()
+    {
+        IVariableNode node = (IVariableNode) getNode("var a:int = 123.4;",
+                IVariableNode.class);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {number} */ a = (123.4) >> 0");
+    }
+
+    @Test
+    public void testVarDeclaration_withTypeUintAndAssignedNumber()
+    {
+        IVariableNode node = (IVariableNode) getNode("var a:uint = 123.4;",
+                IVariableNode.class);
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {number} */ a = (123.4) >>> 0");
+    }
+
     //----------------------------------
     // const declaration
     //----------------------------------

Reply via email to