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);
}