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);
}