Created
February 7, 2012 12:32
-
-
Save melix/1759498 to your computer and use it in GitHub Desktop.
UnaryExpressionHelper patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java | |
index 925ffd7..4555783 100644 | |
--- a/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java | |
+++ b/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java | |
@@ -71,10 +71,6 @@ public class AsmClassGenerator extends ClassGenerator { | |
static final MethodCaller despreadList = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "despreadList"); | |
// Closure | |
static final MethodCaller getMethodPointer = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "getMethodPointer"); | |
- // unary plus, unary minus, bitwise negation | |
- static final MethodCaller unaryPlus = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "unaryPlus"); | |
- static final MethodCaller unaryMinus = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "unaryMinus"); | |
- static final MethodCaller bitwiseNegate = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "bitwiseNegate"); | |
// type conversions | |
static final MethodCaller createListMethod = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "createList"); | |
@@ -599,30 +595,15 @@ public class AsmClassGenerator extends ClassGenerator { | |
} | |
public void visitUnaryMinusExpression(UnaryMinusExpression expression) { | |
- Expression subExpression = expression.getExpression(); | |
- subExpression.visit(this); | |
- controller.getOperandStack().box(); | |
- unaryMinus.call(controller.getMethodVisitor()); | |
- controller.getOperandStack().replace(ClassHelper.OBJECT_TYPE); | |
- controller.getAssertionWriter().record(expression); | |
+ controller.getUnaryExpHelper().writeUnaryMinus(expression); | |
} | |
public void visitUnaryPlusExpression(UnaryPlusExpression expression) { | |
- Expression subExpression = expression.getExpression(); | |
- subExpression.visit(this); | |
- controller.getOperandStack().box(); | |
- unaryPlus.call(controller.getMethodVisitor()); | |
- controller.getOperandStack().replace(ClassHelper.OBJECT_TYPE); | |
- controller.getAssertionWriter().record(expression); | |
+ controller.getUnaryExpHelper().writeUnaryPlus(expression); | |
} | |
public void visitBitwiseNegationExpression(BitwiseNegationExpression expression) { | |
- Expression subExpression = expression.getExpression(); | |
- subExpression.visit(this); | |
- controller.getOperandStack().box(); | |
- bitwiseNegate.call(controller.getMethodVisitor()); | |
- controller.getOperandStack().replace(ClassHelper.OBJECT_TYPE); | |
- controller.getAssertionWriter().record(expression); | |
+ controller.getUnaryExpHelper().writeBitwiseNegate(expression); | |
} | |
public void visitCastExpression(CastExpression castExpression) { | |
@@ -636,12 +617,7 @@ public class AsmClassGenerator extends ClassGenerator { | |
} | |
public void visitNotExpression(NotExpression expression) { | |
- Expression subExpression = expression.getExpression(); | |
- int mark = controller.getOperandStack().getStackLength(); | |
- subExpression.visit(this); | |
- controller.getOperandStack().castToBool(mark, true); | |
- BytecodeHelper.negateBoolean(controller.getMethodVisitor()); | |
- controller.getAssertionWriter().record(expression); | |
+ controller.getUnaryExpHelper().writeNotExpression(expression); | |
} | |
/** | |
diff --git a/src/main/org/codehaus/groovy/classgen/asm/DelegatingController.java b/src/main/org/codehaus/groovy/classgen/asm/DelegatingController.java | |
index 6cfef94..1725fdb 100644 | |
--- a/src/main/org/codehaus/groovy/classgen/asm/DelegatingController.java | |
+++ b/src/main/org/codehaus/groovy/classgen/asm/DelegatingController.java | |
@@ -85,7 +85,12 @@ public class DelegatingController extends WriterController { | |
public BinaryExpressionHelper getBinaryExpHelper() { | |
return delegationController.getBinaryExpHelper(); | |
} | |
- | |
+ | |
+ @Override | |
+ public UnaryExpressionHelper getUnaryExpHelper() { | |
+ return delegationController.getUnaryExpHelper(); | |
+ } | |
+ | |
@Override | |
public String getClassName() { | |
return delegationController.getClassName(); | |
diff --git a/src/main/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/org/codehaus/groovy/classgen/asm/WriterController.java | |
index c23e21a..0e7b3e0 100644 | |
--- a/src/main/org/codehaus/groovy/classgen/asm/WriterController.java | |
+++ b/src/main/org/codehaus/groovy/classgen/asm/WriterController.java | |
@@ -44,6 +44,7 @@ public class WriterController { | |
private String internalClassName; | |
private InvocationWriter invocationWriter; | |
private BinaryExpressionHelper binaryExpHelper, fastPathBinaryExpHelper; | |
+ private UnaryExpressionHelper unaryExpressionHelper, fastPathUnaryExpHelper; | |
private AssertionWriter assertionWriter; | |
private String internalBaseClassName; | |
private ClassNode outermostClass; | |
@@ -82,10 +83,14 @@ public class WriterController { | |
} | |
this.binaryExpHelper = new BinaryExpressionHelper(this); | |
+ this.unaryExpressionHelper = new UnaryExpressionHelper(this); | |
if (optimizeForInt) { | |
- this.fastPathBinaryExpHelper = new BinaryExpressionMultiTypeDispatcher(this); | |
+ this.fastPathBinaryExpHelper = new BinaryExpressionMultiTypeDispatcher(this); | |
+ // todo: replace with a real fast path unary expression helper when available | |
+ this.fastPathUnaryExpHelper = new UnaryExpressionHelper(this); | |
} else { | |
this.fastPathBinaryExpHelper = this.binaryExpHelper; | |
+ this.fastPathUnaryExpHelper = new UnaryExpressionHelper(this); | |
} | |
this.operandStack = new OperandStack(this); | |
@@ -161,6 +166,14 @@ public class WriterController { | |
} | |
} | |
+ public UnaryExpressionHelper getUnaryExpHelper() { | |
+ if (fastPath) { | |
+ return fastPathUnaryExpHelper; | |
+ } else { | |
+ return unaryExpressionHelper; | |
+ } | |
+ } | |
+ | |
public AssertionWriter getAssertionWriter() { | |
return assertionWriter; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment