How to filter results of a virtual method?

Jim Laskey jlaskey at me.com
Wed Jan 26 09:17:54 PST 2011


A non-text attachment was scrubbed...
Name: TestFilter.java
Type: application/octet-stream
Size: 1459 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110126/0da42fce/attachment.obj 
-------------- next part --------------


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



More information about the mlvm-dev mailing list