Skip to content

Instantly share code, notes, and snippets.

@melix
Created February 7, 2012 12:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save melix/1759498 to your computer and use it in GitHub Desktop.
Save melix/1759498 to your computer and use it in GitHub Desktop.
UnaryExpressionHelper patch
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