Author: hlship
Date: Wed Apr 13 22:24:01 2011
New Revision: 1091958
URL: http://svn.apache.org/viewvc?rev=1091958&view=rev
Log:
TAP5-853: Re-implement range ops with subexpressions
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java?rev=1091958&r1=1091957&r2=1091958&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java
Wed Apr 13 22:24:01 2011
@@ -23,7 +23,7 @@ import org.apache.tapestry5.ioc.internal
import org.apache.tapestry5.ioc.services.TypeCoercer;
/**
- * Base class for {@link org.apache.tapestry5.PropertyConduit} instances
created by the
+ * Companion class for {@link org.apache.tapestry5.PropertyConduit} instances
created by the
* {@link org.apache.tapestry5.services.PropertyConduitSource}.
*/
@SuppressWarnings("all")
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=1091958&r1=1091957&r2=1091958&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:24:01 2011
@@ -664,7 +664,7 @@ public class PropertyConduitSourceImpl i
// top level, which
// means we didn't need the navigate method after all.
- // createPlasticRangeOpGetter(node, "root");
+ createPlasticRangeOpGetter(node);
createPlasticNoOpSetter();
conduitPropertyType = IntegerRange.class;
@@ -752,6 +752,28 @@ public class PropertyConduitSourceImpl i
}
}
+ private void createPlasticRangeOpGetter(final Tree rangeNode)
+ {
+ plasticClass.introduceMethod(GET, new InstructionBuilderCallback()
+ {
+ public void doBuild(InstructionBuilder builder)
+ {
+ // Put the delegate on top of the stack
+
+ builder.loadThis().getField(delegateField);
+
+ invokeMethod(builder, DelegateMethods.RANGE, rangeNode, 0);
+
+ builder.returnResult();
+ }
+ });
+ }
+
+ private Object foo(PropertyConduitDelegate d)
+ {
+ return d.range(1, 99);
+ }
+
private void createRangeOpGetter(Tree node, String rootName)
{
BodyBuilder builder = new BodyBuilder().begin();
@@ -1258,7 +1280,7 @@ public class PropertyConduitSourceImpl i
}
else
{
- invokeMethod(builder, info.getReadMethod(), termNode);
+ invokeMethod(builder, info.getReadMethod(), termNode, 1);
}
return termType;
@@ -1269,10 +1291,16 @@ public class PropertyConduitSourceImpl i
* to be evaluated, and potentially coerced, so that they may be
passed to the method.
*
* @param builder
+ * constructs code
* @param method
- * @param invokeNode
+ * method to invoke
+ * @param node
+ * INVOKE or RANGEOP node
+ * @param childOffset
+ * offset within the node to the first child expression (1
in an INVOKE node because the
+ * first child is the method name, 0 in a RANGEOP node)
*/
- private void invokeMethod(InstructionBuilder builder, Method method,
Tree invokeNode)
+ private void invokeMethod(InstructionBuilder builder, Method method,
Tree node, int childOffset)
{
// We start with the target object for the method on top of the
stack.
// Next, we have to push each method parameter, which may include
boxing/deboxing
@@ -1285,7 +1313,7 @@ public class PropertyConduitSourceImpl i
for (int i = 0; i < parameterTypes.length; i++)
{
- Class expressionType = buildSubexpression(builder, null,
invokeNode.getChild(i + 1));
+ Class expressionType = buildSubexpression(builder, null,
node.getChild(i + childOffset));
// The value left on the stack is not primitive, and
expressionType represents
// its real type.
@@ -1294,8 +1322,12 @@ public class PropertyConduitSourceImpl i
if (!parameterType.isAssignableFrom(expressionType))
{
+ if (expressionType.isPrimitive())
+ {
+ builder.boxPrimitive(expressionType.getName());
+ }
+
builder.loadThis().getField(delegateField);
- // TODO: Will this work for wide primitives?
builder.swap().loadTypeConstant(PlasticUtils.toWrapperType(parameterType));
builder.invoke(DelegateMethods.COERCE);
@@ -1551,7 +1583,7 @@ public class PropertyConduitSourceImpl i
}
else
{
- invokeMethod(builder, method, term);
+ invokeMethod(builder, method, term, 1);
}
builder.dupe().when(Condition.NULL, new
InstructionBuilderCallback()
@@ -2102,6 +2134,20 @@ public class PropertyConduitSourceImpl i
}
}
+ private Class processConstant(InstructionBuilder builder, Tree integerNode)
+ {
+ long value = Long.parseLong(integerNode.getText());
+
+ if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE)
+ {
+ builder.loadConstant((int) value);
+ return int.class;
+ }
+
+ builder.loadConstant(value);
+ return long.class;
+ }
+
/**
* May be invoked from fabricated PropertyConduit instances.
*/
@@ -2112,4 +2158,5 @@ public class PropertyConduitSourceImpl i
return new NullPointerException(message);
}
+
}