Author: hlship
Date: Wed Apr 13 22:23:35 2011
New Revision: 1091950
URL: http://svn.apache.org/viewvc?rev=1091950&view=rev
Log:
TAP5-853: Make InstructionBuilder.loadConstant() aware of the various constant
opcodes
Modified:
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/MethodImplementationTests.groovy
Modified:
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java?rev=1091950&r1=1091949&r2=1091950&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
(original)
+++
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
Wed Apr 13 22:23:35 2011
@@ -52,6 +52,33 @@ public class InstructionBuilderImpl exte
m.put(Condition.NON_ZERO, IFEQ);
}
+ private static final Map<Object, Integer> constantOpcodes = new
HashMap<Object, Integer>();
+
+ static
+ {
+ Map<Object, Integer> m = constantOpcodes;
+
+ m.put(Integer.valueOf(-1), ICONST_M1);
+ m.put(Integer.valueOf(0), ICONST_0);
+ m.put(Integer.valueOf(1), ICONST_1);
+ m.put(Integer.valueOf(2), ICONST_2);
+ m.put(Integer.valueOf(3), ICONST_3);
+ m.put(Integer.valueOf(4), ICONST_4);
+ m.put(Integer.valueOf(5), ICONST_5);
+
+ m.put(Long.valueOf(0), LCONST_0);
+ m.put(Long.valueOf(1), LCONST_1);
+
+ m.put(Float.valueOf(0), FCONST_0);
+ m.put(Float.valueOf(1), FCONST_1);
+ m.put(Float.valueOf(2), FCONST_2);
+
+ m.put(Double.valueOf(0), DCONST_0);
+ m.put(Double.valueOf(1), DCONST_1);
+
+ m.put(null, ACONST_NULL);
+ }
+
protected final InstructionBuilderState state;
protected final MethodVisitor v;
@@ -450,7 +477,12 @@ public class InstructionBuilderImpl exte
{
check();
- v.visitLdcInsn(constant);
+ Integer opcode = constantOpcodes.get(constant);
+
+ if (opcode != null)
+ v.visitInsn(opcode);
+ else
+ v.visitLdcInsn(constant);
return this;
}
Modified:
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java?rev=1091950&r1=1091949&r2=1091950&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
(original)
+++
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
Wed Apr 13 22:23:35 2011
@@ -300,9 +300,9 @@ public interface InstructionBuilder
* Loads a constant value
*
* @param constant
- * a non-null Integer, Float, Double, Long, String.
+ * Integer, Float, Double, Long, String or null
*/
- @Opcodes("LDC")
+ @Opcodes("LDC, ICONST_*, LCONST_*, FCONST_*, DCONST_*, ACONST_NULL")
InstructionBuilder loadConstant(Object constant);
/**
Modified:
tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/MethodImplementationTests.groovy
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/MethodImplementationTests.groovy?rev=1091950&r1=1091949&r2=1091950&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/MethodImplementationTests.groovy
(original)
+++
tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/MethodImplementationTests.groovy
Wed Apr 13 22:23:35 2011
@@ -24,4 +24,23 @@ class MethodImplementationTests extends
o.value == 97
}
+
+ def "support for constant opcodes"() {
+ setup:
+
+ def mgr = createMgr ( { PlasticClass pc ->
+ def b = findMethod(pc, "getValue").changeImplementation( { b ->
+ b.loadConstant(2).returnResult()
+ } as InstructionBuilderCallback )
+ } as PlasticClassTransformer)
+
+ when:
+
+ def o =
mgr.getClassInstantiator("testsubjects.MethodReimplementationSubject").newInstance()
+
+ then:
+ "There's no way to tell from the outside, but should use the ICONST_2
opcode."
+
+ o.value == 2
+ }
}