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 2017/01/26 05:30:38 UTC
[04/50] groovy git commit: Groovy-7291: reenable tests and fix the
fix for indy as well
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/d319b8a1
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/d319b8a1
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/d319b8a1
Branch: refs/heads/GROOVY_2_4_X
Commit: d319b8a18a53555308286719a6fdb890a5a7dd30
Parents: 269c0c8
Author: Jochen Theodorou <bl...@gmx.org>
Authored: Sun Oct 16 15:59:50 2016 +0200
Committer: Jochen Theodorou <bl...@gmx.org>
Committed: Sun Oct 16 16:02:47 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/d319b8a1/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 3d30e20..e1d17da 100644
--- a/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -388,7 +388,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/d319b8a1/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 edd37d5..0c98fd6 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/d319b8a1/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 e72b112..17a9810 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/d319b8a1/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()