You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by yi...@apache.org on 2020/04/09 09:31:40 UTC

[royale-compiler] branch issue_143 updated: Check for null assignment, ignore non-binary operator assignments, ignore this memeber access

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

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


The following commit(s) were added to refs/heads/issue_143 by this push:
     new e81b5dc  Check for null assignment, ignore non-binary operator assignments, ignore this memeber access
e81b5dc is described below

commit e81b5dc753a99b94278d021890e406a0864b7137
Author: DESKTOP-RH4S838\Yishay <yi...@hotmail.com>
AuthorDate: Thu Apr 9 12:29:57 2020 +0300

    Check for null assignment, ignore non-binary operator assignments,
    ignore this memeber access
    
    Reference #143
---
 .../royale/compiler/codegen/js/IJSEmitter.java     |  1 +
 .../compiler/internal/codegen/js/JSEmitter.java    | 36 +++++++++++++++-------
 .../codegen/js/jx/BinaryOperatorEmitter.java       |  2 +-
 .../codegen/js/royale/JSRoyaleEmitterTokens.java   |  1 +
 4 files changed, 28 insertions(+), 12 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 c20261c..b4ab41c 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
@@ -49,4 +49,5 @@ public interface IJSEmitter extends IASEmitter, IMappingEmitter
     void emitClosureEnd(IASNode node, IDefinition nodeDef);
 
     void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition definition);
+    void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition definition, Boolean checkForConditionalBind);
 }
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 24c65f3..e7d5194 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
@@ -40,7 +40,6 @@ import org.apache.royale.compiler.definitions.metadata.IMetaTag;
 import org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitter;
 import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
-import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.royale.compiler.internal.codegen.js.jx.BlockCloseEmitter;
 import org.apache.royale.compiler.internal.codegen.js.jx.BlockOpenEmitter;
 import org.apache.royale.compiler.internal.codegen.js.jx.CatchEmitter;
@@ -73,6 +72,7 @@ import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.semantics.SemanticUtils;
 import org.apache.royale.compiler.internal.tree.as.*;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.IASNode;
 import org.apache.royale.compiler.tree.as.ICatchNode;
 import org.apache.royale.compiler.tree.as.IContainerNode;
@@ -543,7 +543,7 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
         }
     }
 
-    public void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition definition)
+    public void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition definition, Boolean checkForConditionalBind)
     {
         IDefinition assignedDef = null;
         IDefinition assignedTypeDef = null;
@@ -915,16 +915,9 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
 		{
 			write(coercionStart);
         }
-		if (project.getBuiltinType(BuiltinType.FUNCTION).equals(definition) && 
+		if (checkForConditionalBind && project.getBuiltinType(BuiltinType.FUNCTION).equals(definition) && 
 				assignedNode instanceof MemberAccessExpressionNode) {
-			write(JSGoogEmitterTokens.GOOG_BIND.getToken() + 
-					ASEmitterTokens.PAREN_OPEN.getToken()
-			);
-			emitAssignedValue(assignedNode);
-			write(ASEmitterTokens.COMMA.getToken());
-			MemberAccessExpressionNode maenode = (MemberAccessExpressionNode)assignedNode;
-			getWalker().walk(maenode.getLeftOperandNode());
-			write(ASEmitterTokens.PAREN_CLOSE.getToken());
+			emitAssignedCoercionHelper(assignedNode);
 		} else {
 			emitAssignedValue(assignedNode);
 		}
@@ -940,5 +933,26 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
 			}
 		}
     }
+    
+    private void emitAssignedCoercionHelper(IExpressionNode assignedNode) {
+    	MemberAccessExpressionNode maeNode = (MemberAccessExpressionNode)assignedNode;
+		if (maeNode.getLeftOperandNode() instanceof ILanguageIdentifierNode && 
+				((ILanguageIdentifierNode)maeNode.getLeftOperandNode()).getKind().equals(ILanguageIdentifierNode.LanguageIdentifierKind.THIS)) {
+			emitAssignedValue(assignedNode);
+		} else {
+			write(JSRoyaleEmitterTokens.CONDITIONAL_BIND_FUNCTION_NAME.getToken()  + 
+					ASEmitterTokens.PAREN_OPEN.getToken()
+			);
+			emitAssignedValue(assignedNode);
+			write(ASEmitterTokens.COMMA.getToken());
+			getWalker().walk(maeNode.getLeftOperandNode());
+			write(ASEmitterTokens.PAREN_CLOSE.getToken());
+		}
+    }
+    
+    public void emitAssignmentCoercion(IExpressionNode assignedNode, IDefinition definition)
+    {
+    	emitAssignmentCoercion(assignedNode, definition, false);
+    }
 
 }
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 2aa2e77..a0ed8eb 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
@@ -568,7 +568,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
 
 			if (isAssignment)
 			{
-				getEmitter().emitAssignmentCoercion(node.getRightOperandNode(), node.getLeftOperandNode().resolveType(getProject()));
+				getEmitter().emitAssignmentCoercion(node.getRightOperandNode(), node.getLeftOperandNode().resolveType(getProject()), true);
 			}
 			else
 			{
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitterTokens.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitterTokens.java
index 7e9d169..722906e 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitterTokens.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitterTokens.java
@@ -68,6 +68,7 @@ public enum JSRoyaleEmitterTokens implements IEmitterTokens
     SETTER_PREFIX("set__"),
     BINDABLE_PREFIX("bindable__"),
     CLOSURE_FUNCTION_NAME("org.apache.royale.utils.Language.closure"),
+    CONDITIONAL_BIND_FUNCTION_NAME("org.apache.royale.utils.Language.conditionalBind"),
     SKIP_AS_COERCIONS("skipAsCoercions"),
     SKIP_FUNCTION_COERCIONS("skipFunctionCoercions"),
     JSX("JSX"),