Attachment: 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

Reply via email to