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
+    }
 }