I think it's a simple issue. Drop should use 1 instead of 0.
public static
MethodHandle filterReturnValue(MethodHandle target, MethodHandle filter) {
MethodType targetType = target.type();
MethodType filterType = filter.type();
if (filterType.parameterCount() != 1
|| filterType.parameterType(0) != targetType.returnType())
System.err.println("target and filter types do not match");
// FIXME: Too many nodes here.
MethodHandle returner = dropArguments(filter, 0,
targetType.parameterList()); <<< 0 should be 1
return foldArguments(returner,
exactInvoker(target.type()).bindTo(target));
}
Cheers,
-- Jim
On 2011-01-26, at 1:17 PM, Jim Laskey wrote:
TestFilter.java
Description: Binary data
>
>
> Is there a way to filter the result of a virtual method? Seems okay for
> statics, but receiver runs interference on virtual calls.
>
> Running the enclosed I get;
>
> 10.0
> java.lang.IllegalArgumentException: target and combiner types must match:
> (TestFilter,int)double != (TestFilter)int
> at sun.dyn.MemberName.newIllegalArgumentException(MemberName.java:513)
> at java.dyn.MethodHandles.misMatchedTypes(MethodHandles.java:1706)
> at java.dyn.MethodHandles.foldArguments(MethodHandles.java:1646)
> at java.dyn.MethodHandles.filterReturnValue(MethodHandles.java:1588)
> at TestFilter.main(TestFilter.java:29)
>
>
> Source:;
>
> import java.dyn.*;
>
> public class TestFilter {
>
> public static int a = 10;
> public int b = 10;
>
> public static double filter(int x) {
> return (double)x;
> }
>
> public static void main(String[] args) {
> try {
> MethodHandles.Lookup lookup = MethodHandles.lookup();
> MethodHandle getter = lookup.findStaticGetter(TestFilter.class,
> "a", int.class);
> MethodHandle filter = lookup.findStatic(TestFilter.class,
> "filter", MethodType.methodType(double.class, int.class));
> MethodHandle filteredGetter =
> MethodHandles.filterReturnValue(getter, filter);
>
> Object result = filteredGetter.invokeWithArguments();
> System.out.println(result);
> } catch (Throwable throwable) {
> throwable.printStackTrace();
> }
>
> try {
> MethodHandles.Lookup lookup = MethodHandles.lookup();
> MethodHandle getter = lookup.findGetter(TestFilter.class, "b",
> int.class);
> MethodHandle filter = lookup.findStatic(TestFilter.class,
> "filter", MethodType.methodType(double.class, int.class));
> MethodHandle filteredGetter =
> MethodHandles.filterReturnValue(getter, filter);
>
> TestFilter m = new TestFilter();
> Object result = filteredGetter.invokeWithArguments();
> System.out.println(result);
> } catch (Throwable throwable) {
> throwable.printStackTrace();
> }
> }
> }
>
_______________________________________________ mlvm-dev mailing list [email protected] http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
