You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/04/14 00:23:35 UTC
svn commit: r1091950 - in /tapestry/tapestry5/trunk/plastic/src:
main/java/org/apache/tapestry5/internal/plastic/
main/java/org/apache/tapestry5/plastic/
test/groovy/org/apache/tapestry5/plastic/
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
+ }
}