You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/09/12 06:15:42 UTC

[groovy] branch master updated: GROOVY-9732: re-implement transformExpression and several setters (closes #1361)

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

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new d696771  GROOVY-9732: re-implement transformExpression and several setters (closes #1361)
d696771 is described below

commit d696771141041f6b12340c81ee4682300530cc31
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Sep 8 09:57:45 2020 -0500

    GROOVY-9732: re-implement transformExpression and several setters (closes #1361)
---
 .../sc/transformers/CompareToNullExpression.java   | 55 +++++++++++++++-------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
index 723be81..8c4e4f1 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
@@ -19,7 +19,6 @@
 package org.codehaus.groovy.transform.sc.transformers;
 
 import org.codehaus.groovy.ast.ClassHelper;
-import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
 import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
@@ -35,21 +34,38 @@ import org.objectweb.asm.Opcodes;
 
 public class CompareToNullExpression extends BinaryExpression implements Opcodes {
     private final boolean equalsNull;
-    private final Expression objectExpression;
 
     public CompareToNullExpression(final Expression objectExpression, final boolean compareToNull) {
         super(objectExpression, new Token(Types.COMPARE_TO, compareToNull ? "==" : "!=", -1, -1), ConstantExpression.NULL);
-        this.objectExpression = objectExpression;
+        super.setType(ClassHelper.boolean_TYPE);
         this.equalsNull = compareToNull;
     }
 
     public Expression getObjectExpression() {
-        return objectExpression;
+        return getLeftExpression();
+    }
+
+    @Override
+    public void setLeftExpression(final Expression expression) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setRightExpression(final Expression expression) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setType(final org.codehaus.groovy.ast.ClassNode type) {
+        throw new UnsupportedOperationException();
     }
 
     @Override
     public Expression transformExpression(final ExpressionTransformer transformer) {
-        return this;
+        Expression ret = new CompareToNullExpression(transformer.transform(getObjectExpression()), equalsNull);
+        ret.setSourcePosition(this);
+        ret.copyNodeMetaData(this);
+        return ret;
     }
 
     @Override
@@ -58,23 +74,26 @@ public class CompareToNullExpression extends BinaryExpression implements Opcodes
             AsmClassGenerator acg = (AsmClassGenerator) visitor;
             WriterController controller = acg.getController();
             MethodVisitor mv = controller.getMethodVisitor();
-            objectExpression.visit(acg);
-            ClassNode top = controller.getOperandStack().getTopOperand();
-            if (ClassHelper.isPrimitiveType(top)) {
+
+            getObjectExpression().visit(acg);
+
+            if (ClassHelper.isPrimitiveType(controller.getOperandStack().getTopOperand())) {
                 controller.getOperandStack().pop();
                 mv.visitInsn(equalsNull ? ICONST_0 : ICONST_1);
+
                 controller.getOperandStack().push(ClassHelper.boolean_TYPE);
-                return;
+            } else {
+                Label zero = new Label();
+                mv.visitJumpInsn(equalsNull ? IFNONNULL : IFNULL, zero);
+                mv.visitInsn(ICONST_1);
+                Label end = new Label();
+                mv.visitJumpInsn(GOTO, end);
+                mv.visitLabel(zero);
+                mv.visitInsn(ICONST_0);
+                mv.visitLabel(end);
+
+                controller.getOperandStack().replace(ClassHelper.boolean_TYPE);
             }
-            Label zero = new Label();
-            mv.visitJumpInsn(equalsNull ? IFNONNULL : IFNULL, zero);
-            mv.visitInsn(ICONST_1);
-            Label end = new Label();
-            mv.visitJumpInsn(GOTO, end);
-            mv.visitLabel(zero);
-            mv.visitInsn(ICONST_0);
-            mv.visitLabel(end);
-            controller.getOperandStack().replace(ClassHelper.boolean_TYPE);
         } else {
             super.visit(visitor);
         }