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 <[email protected]>
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"),

Reply via email to