Groovy-7291: reenable tests and fix the fix for indy as well
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3c074dc2 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3c074dc2 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3c074dc2 Branch: refs/heads/parrot Commit: 3c074dc2058d4c5115f172094385d9efd302f3ce Parents: 7266497 Author: Jochen Theodorou <blackd...@gmx.org> Authored: Sun Oct 16 15:59:50 2016 +0200 Committer: Jochen Theodorou <blackd...@gmx.org> Committed: Sun Oct 16 16:01:06 2016 +0200 ---------------------------------------------------------------------- .../groovy/classgen/AsmClassGenerator.java | 6 ++++- .../groovy/classgen/asm/CompileStack.java | 15 ++++++++--- .../classgen/asm/OptimizingStatementWriter.java | 28 ++++---------------- src/test/groovy/bugs/Groovy7291Bug.groovy | 21 +-------------- 4 files changed, 22 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/3c074dc2/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java index 30a49e0..3fb441a 100644 --- a/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java +++ b/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java @@ -396,7 +396,11 @@ public class AsmClassGenerator extends ClassGenerator { } // we use this NOP to have a valid jump target for the various labels //mv.visitInsn(NOP); - mv.visitMaxs(0, 0); + try { + mv.visitMaxs(0, 0); + } catch (Exception e) { + throw new GroovyRuntimeException("ASM reporting processing error for "+controller.getClassNode()+"#"+node.getName()+" with signature "+node.getTypeDescriptor()+" in "+sourceFile+":"+node.getLineNumber(), e); + } } mv.visitEnd(); } http://git-wip-us.apache.org/repos/asf/groovy/blob/3c074dc2/src/main/org/codehaus/groovy/classgen/asm/CompileStack.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/asm/CompileStack.java b/src/main/org/codehaus/groovy/classgen/asm/CompileStack.java index 8fae1cf..d7220a7 100644 --- a/src/main/org/codehaus/groovy/classgen/asm/CompileStack.java +++ b/src/main/org/codehaus/groovy/classgen/asm/CompileStack.java @@ -658,10 +658,8 @@ public class CompileStack implements Opcodes { public BytecodeVariable defineVariable(Variable v, boolean initFromStack) { return defineVariable(v, v.getOriginType(), initFromStack); } + public BytecodeVariable defineVariable(Variable v, ClassNode variableType, boolean initFromStack) { - //TODO: any usage of this method should have different operand stack handing - // then the remove(1) here and there in this one can be removed and others - // can be changed String name = v.getName(); BytecodeVariable answer = defineVar(name, variableType, v.isClosureSharedVariable(), v.isClosureSharedVariable()); stackVariables.put(name, answer); @@ -672,7 +670,16 @@ public class CompileStack implements Opcodes { ClassNode type = answer.getType().redirect(); OperandStack operandStack = controller.getOperandStack(); - if (!initFromStack) pushInitValue(type, mv); + if (!initFromStack) { + if (ClassHelper.isPrimitiveType(v.getOriginType()) && ClassHelper.getWrapper(v.getOriginType()) == variableType) { + pushInitValue(v.getOriginType(), mv); + operandStack.push(v.getOriginType()); + operandStack.box(); + operandStack.remove(1); + } else { + pushInitValue(type, mv); + } + } operandStack.push(answer.getType()); if (answer.isHolder()) { operandStack.box(); http://git-wip-us.apache.org/repos/asf/groovy/blob/3c074dc2/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java index b6a54d5..c9de6f8 100644 --- a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java +++ b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java @@ -581,37 +581,19 @@ public class OptimizingStatementWriter extends StatementWriter { addTypeInformation(expression.getExpression(),expression); } - private void replaceEmptyToConstantZeroIfNecessary(DeclarationExpression expression) { - // GROOVY-7291 and GROOVY-5570, a variable referenced by closure cannot be primitive type - // So here's a trick: in this case replace EmptyExpression on the right side to a ConstantExpression - Expression leftExpression = expression.getLeftExpression(); - Expression rightExpression=expression.getRightExpression(); - if (leftExpression instanceof VariableExpression - && rightExpression instanceof EmptyExpression) { - VariableExpression leftVariableExpression = (VariableExpression) leftExpression; - - if (isPrimitiveType(leftVariableExpression.getOriginType()) - && leftVariableExpression.isClosureSharedVariable()) { - expression.setRightExpression(new ConstantExpression(0)); - } - } - } - @Override public void visitDeclarationExpression(DeclarationExpression expression) { - replaceEmptyToConstantZeroIfNecessary(expression); - - Expression rightExpression = expression.getRightExpression(); - rightExpression.visit(this); + Expression right = expression.getRightExpression(); + right.visit(this); ClassNode leftType = typeChooser.resolveType(expression.getLeftExpression(), node); + Expression rightExpression = expression.getRightExpression(); ClassNode rightType = optimizeDivWithIntOrLongTarget(rightExpression, leftType); - - if (rightType==null) rightType = typeChooser.resolveType(rightExpression, node); + if (rightType==null) rightType = typeChooser.resolveType(expression.getRightExpression(), node); if (isPrimitiveType(leftType) && isPrimitiveType(rightType)) { // if right is a constant, then we optimize only if it makes // a block complete, so we set a maybe - if (rightExpression instanceof ConstantExpression) { + if (right instanceof ConstantExpression) { opt.chainCanOptimize(true); } else { opt.chainShouldOptimize(true); http://git-wip-us.apache.org/repos/asf/groovy/blob/3c074dc2/src/test/groovy/bugs/Groovy7291Bug.groovy ---------------------------------------------------------------------- diff --git a/src/test/groovy/bugs/Groovy7291Bug.groovy b/src/test/groovy/bugs/Groovy7291Bug.groovy index 1e83f81..22203d0 100644 --- a/src/test/groovy/bugs/Groovy7291Bug.groovy +++ b/src/test/groovy/bugs/Groovy7291Bug.groovy @@ -18,32 +18,13 @@ */ package groovy.bugs -import groovy.transform.NotYetImplemented - class Groovy7291Bug extends GroovyTestCase { - static final boolean runningWithIndy = Boolean.getBoolean('groovy.target.indy') - - @NotYetImplemented - void testPrimitiveDoubleIndy() { - if (!runningWithIndy) return - assertScript ''' - double a - def b = { - a = a + 1 - } - b() - assert a == 1.0d - ''' - } - void testPrimitiveDouble() { - // TODO: remove this conditional and method above when fixed for Indy - if (runningWithIndy) return - assertScript ''' double a def b = { + assert a.class == Double a = a + 1 } b()