This is an automated email from the ASF dual-hosted git repository.
emilles 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 001d41ecb1 GROOVY-11229: `instanceof` variable without temporary
variable
001d41ecb1 is described below
commit 001d41ecb1ea87adf5b512bd216ba32122998191
Author: Eric Milles <[email protected]>
AuthorDate: Sun Mar 23 08:42:07 2025 -0500
GROOVY-11229: `instanceof` variable without temporary variable
---
.../classgen/asm/BinaryExpressionHelper.java | 26 +++++++++++++---------
.../codehaus/groovy/classgen/asm/OperandStack.java | 4 ++--
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
index d209baab76..357da0930e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -114,6 +114,7 @@ import static org.objectweb.asm.Opcodes.ACONST_NULL;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.DCONST_0;
import static org.objectweb.asm.Opcodes.DUP;
+import static org.objectweb.asm.Opcodes.DUP_X1;
import static org.objectweb.asm.Opcodes.FCONST_0;
import static org.objectweb.asm.Opcodes.GOTO;
import static org.objectweb.asm.Opcodes.ICONST_0;
@@ -775,31 +776,34 @@ public class BinaryExpressionHelper {
expression.getLeftExpression().visit(controller.getAcg());
operandStack.box(); // TODO: support instanceof primitives
- ClassNode sourceType = operandStack.getTopOperand();
+ //ClassNode sourceType = operandStack.getTopOperand();
ClassNode targetType = expression.getRightExpression().getType();
- int jep394 = 0;
- if (!(expression.getRightExpression() instanceof ClassExpression)) {
+ var jep394 = !(expression.getRightExpression() instanceof
ClassExpression);
+ if (jep394) {
operandStack.dup(); // stash value for use by JEP 394 pattern
variable
- String name =
"instanceof"+Integer.toHexString(expression.hashCode());
- jep394 = compileStack.defineTemporaryVariable(name, sourceType,
true);
}
String typeName = BytecodeHelper.getClassInternalName(targetType);
controller.getMethodVisitor().visitTypeInsn(INSTANCEOF, typeName);
operandStack.replace(ClassHelper.boolean_TYPE);
- if (jep394 > 0) {
+ if (jep394) {
var variable = (Variable) ((BinaryExpression)
expression.getRightExpression()).getLeftExpression();
BytecodeVariable v = compileStack.defineVariable(variable,
targetType, false);
+ MethodVisitor mv = controller.getMethodVisitor();
- operandStack.dup();
+ mv.visitInsn(DUP_X1); // stack: ..., check, value, check
Label l0 = operandStack.jump(IFEQ); // skip store if not instanceof
- BytecodeHelper.load(controller.getMethodVisitor(), sourceType,
jep394);
- BytecodeHelper.store(controller.getMethodVisitor(), targetType,
v.getIndex());
- controller.getMethodVisitor().visitLabel(l0);
- compileStack.removeVar(jep394);
+ BytecodeHelper.store(mv, targetType, v.getIndex());
+ Label l1 = operandStack.jump(GOTO); // skip pop
+
+ mv.visitLabel(l0); // stack: ..., check, value
+ mv.visitInsn(POP);
+
+ mv.visitLabel(l1); // stack: ..., check
+ operandStack.push(ClassHelper.boolean_TYPE);
}
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
index 7361906b61..4ff4538551 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
@@ -635,9 +635,9 @@ public class OperandStack {
push(type);
}
- public void pushBool(final boolean inclusive) {
+ public void pushBool(final boolean value) {
MethodVisitor mv = controller.getMethodVisitor();
- mv.visitLdcInsn(inclusive);
+ mv.visitInsn(value ? ICONST_1 : ICONST_0);
push(ClassHelper.boolean_TYPE);
}