You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/04/14 00:23:14 UTC

svn commit: r1091946 - in /tapestry/tapestry5/trunk: plastic/src/main/java/org/apache/tapestry5/internal/plastic/ plastic/src/main/java/org/apache/tapestry5/plastic/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/

Author: hlship
Date: Wed Apr 13 22:23:13 2011
New Revision: 1091946

URL: http://svn.apache.org/viewvc?rev=1091946&view=rev
Log:
TAP5-853: Add ability InstructionBuilder.invoke(java.lang.Method)

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/internal/plastic/PlasticClassImpl.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java

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=1091946&r1=1091945&r2=1091946&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:13 2011
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.internal.plastic;
 
+import java.lang.reflect.Method;
+
 import org.apache.tapestry5.internal.plastic.asm.Label;
 import org.apache.tapestry5.internal.plastic.asm.MethodVisitor;
 import org.apache.tapestry5.internal.plastic.asm.Opcodes;
@@ -198,6 +200,13 @@ public class InstructionBuilderImpl exte
                 PlasticUtils.toTypeNames(argumentTypes));
     }
 
+    public InstructionBuilder invoke(Method method)
+    {
+        check();
+
+        return invoke(method.getDeclaringClass(), method.getReturnType(), method.getName(), method.getParameterTypes());
+    }
+
     public InstructionBuilder invoke(Class clazz, Class returnType, String methodName, Class... argumentTypes)
     {
         check();

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java?rev=1091946&r1=1091945&r2=1091946&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java Wed Apr 13 22:23:13 2011
@@ -94,6 +94,10 @@ public class PlasticClassImpl extends Lo
     private static final String CONSTRUCTOR_DESC = String.format("(L%s;L%s;)V", STATIC_CONTEXT_INTERNAL_NAME,
             INSTANCE_CONTEXT_INTERNAL_NAME);
 
+    private static final Method STATIC_CONTEXT_GET_METHOD = toMethod(StaticContext.class, "get", int.class);
+
+    private static final Method COMPUTED_VALUE_GET_METHOD = toMethod(ComputedValue.class, "get", InstanceContext.class);
+
     private static final MethodDescription TO_STRING_METHOD_DESCRIPTION = new MethodDescription(String.class.getName(),
             "toString");
 
@@ -102,6 +106,18 @@ public class PlasticClassImpl extends Lo
         return "L" + internalName + ";";
     }
 
+    private static Method toMethod(Class declaringClass, String methodName, Class... parameterTypes)
+    {
+        try
+        {
+            return declaringClass.getMethod(methodName, parameterTypes);
+        }
+        catch (Exception ex)
+        {
+            throw new RuntimeException(ex);
+        }
+    }
+
     private class PlasticMember implements AnnotationAccess
     {
         private final AnnotationAccess annotationAccess;
@@ -631,14 +647,12 @@ public class PlasticClassImpl extends Lo
             // Get the ComputedValue out of the StaticContext and onto the stack
 
             constructorBuilder.loadArgument(0).loadConstant(index);
-            constructorBuilder.invoke(StaticContext.class, Object.class, "get", int.class).checkcast(
-                    ComputedValue.class);
+            constructorBuilder.invoke(STATIC_CONTEXT_GET_METHOD).checkcast(ComputedValue.class);
 
             // Add the InstanceContext to the stack
 
             constructorBuilder.loadArgument(1);
-            constructorBuilder.invoke(ComputedValue.class, Object.class, "get", InstanceContext.class).castOrUnbox(
-                    typeName);
+            constructorBuilder.invoke(COMPUTED_VALUE_GET_METHOD).castOrUnbox(typeName);
 
             constructorBuilder.putField(className, node.name, typeName);
         }
@@ -2152,7 +2166,7 @@ public class PlasticClassImpl extends Lo
         constructorBuilder.loadThis();
 
         constructorBuilder.loadArgument(0).loadConstant(index);
-        constructorBuilder.invoke(StaticContext.class, Object.class, "get", int.class);
+        constructorBuilder.invoke(STATIC_CONTEXT_GET_METHOD);
         constructorBuilder.castOrUnbox(fieldType);
 
         constructorBuilder.putField(className, fieldName, fieldType);

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=1091946&r1=1091945&r2=1091946&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:13 2011
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.plastic;
 
+import java.lang.reflect.Method;
+
 /**
  * Simplifies the generation of method instructions for a particular method (or constructor), allowing bytecode to be
  * created with a friendlier API that focuses on Java type names (names as they would appear in Java source) rather than
@@ -85,7 +87,7 @@ public interface InstructionBuilder
 
     @Opcodes("INVOKEVIRTUAL")
     InstructionBuilder invokeVirtual(PlasticMethod method);
-    
+
     /**
      * Invokes a standard virtual method.
      */
@@ -101,6 +103,12 @@ public interface InstructionBuilder
     InstructionBuilder invoke(Class clazz, Class returnType, String methodName, Class... argumentTypes);
 
     /**
+     * Automatically invokes an interface or virtual method. Remember to use {@link #invokeConstructor(Class, Class...)}
+     * for constructors and {@link #invokeSpecial(String, MethodDescription)} for private methods.
+     */
+    InstructionBuilder invoke(Method method);
+
+    /**
      * Invokes a static method of a class.
      */
     @Opcodes("INVOKESTATIC")

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java?rev=1091946&r1=1091945&r2=1091946&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java Wed Apr 13 22:23:13 2011
@@ -92,10 +92,6 @@ public class PropertyConduitSourceImpl i
     private static final MethodSignature SET_SIGNATURE = new MethodSignature(void.class, "set", new Class[]
     { Object.class, Object.class }, null);
 
-    private static final Method RANGE = getMethod(PropertyConduitDelegate.class, "range", int.class, int.class);
-
-    private static final Method INVERT = getMethod(PropertyConduitDelegate.class, "invert", Object.class);
-
     private static final MethodDescription GET_ANNOTATION = getMethodDescription(AnnotationProvider.class,
             "getAnnotation", Class.class);
 
@@ -105,6 +101,15 @@ public class PropertyConduitSourceImpl i
     private static final MethodDescription GET_PROPERTY_NAME = getMethodDescription(InternalPropertyConduit.class,
             "getPropertyName");
 
+    static class DelegateMethods
+    {
+        static final Method INVERT = getMethod(PropertyConduitDelegate.class, "invert", Object.class);
+
+        static final Method RANGE = getMethod(PropertyConduitDelegate.class, "range", int.class, int.class);
+
+        static final Method COERCE = getMethod(PropertyConduitDelegate.class, "coerce", Object.class, Class.class);
+    }
+
     private static final InstructionBuilderCallback RETURN_RESULT = new InstructionBuilderCallback()
     {
         public void doBuild(InstructionBuilder builder)
@@ -749,7 +754,7 @@ public class PropertyConduitSourceImpl i
 
             addRootVariable(builder);
 
-            builder.addln("return %s;", createMethodInvocation(builder, node, rootName, 0, RANGE));
+            builder.addln("return %s;", createMethodInvocation(builder, node, rootName, 0, DelegateMethods.RANGE));
 
             builder.end();
 
@@ -775,8 +780,7 @@ public class PropertyConduitSourceImpl i
 
                     builder.loadThis().getField(delegateField);
 
-                    builder.swap().invoke(PropertyConduitDelegate.class, boolean.class, "invert", new Class[]
-                    { Object.class });
+                    builder.swap().invoke(DelegateMethods.INVERT);
 
                     // When the dust settles, may change invert() to return Boolean, not boolean
 
@@ -883,7 +887,7 @@ public class PropertyConduitSourceImpl i
 
             addRootVariable(builder);
 
-            builder.addln("return ($w) %s;", createMethodInvocation(builder, node, rootName, 0, INVERT));
+            builder.addln("return ($w) %s;", createMethodInvocation(builder, node, rootName, 0, DelegateMethods.INVERT));
 
             builder.end();
 
@@ -1078,8 +1082,7 @@ public class PropertyConduitSourceImpl i
                     else
                     {
                         // Invoke the setter method
-                        builder.invoke(method.getDeclaringClass(), void.class, method.getName(),
-                                method.getParameterTypes());
+                        builder.invoke(method);
                     }
 
                     builder.returnResult();
@@ -1250,8 +1253,7 @@ public class PropertyConduitSourceImpl i
                 {
                     builder.loadThis().getField(delegateField);
                     builder.swap().loadTypeConstant(parameterType);
-                    builder.invoke(PropertyConduitDelegate.class, Object.class, "coerce", Object.class, Class.class);
-                    builder.checkcast(parameterType);
+                    builder.invoke(DelegateMethods.COERCE).checkcast(parameterType);
 
                     // TODO: unboxing if primitive
                 }
@@ -1545,8 +1547,7 @@ public class PropertyConduitSourceImpl i
 
             // TODO: Get subexpressions, use TypeCoercer to get them to right type.
 
-            builder.invoke(method.getDeclaringClass(), method.getReturnType(), method.getName(),
-                    method.getParameterTypes());
+            builder.invoke(method);
 
         }