Le 09/11/2010 14:57, Christian Thalinger a écrit : > On Nov 9, 2010, at 11:43 AM, Rémi Forax wrote: > >> So a workaround for that bug is to declare the return type of >> invokedynamic >> to be not void but by example int. >> > > The fix is trivial but I'd like to implemented to other missing pieces > too, like int-to-float conversion and friends. > > Remi, could you tell me how I can produce AMHs that do such > conversions (on the return type)? >
Here is an example. If indy has no parameter, it tests void -> indy return type If indy has one parameter, it test parameter type -> return type If indy name is "spread", a spread/collect is done. Rémi PS: With the new API, all identity methods but the one that take no parameter can be removed and replace by Methodhandles.identity() in the BSM. --------------------------------------------------------------------------------------------------- public class ConvertTest { private static boolean identity(boolean v) { return v; } private static byte identity(byte v) { return v; } private static char identity(char v) { return v; } private static short identity(short v) { return v; } private static int identity(int v) { return v; } private static long identity(long v) { return v; } private static float identity(float v) { return v; } private static double identity(double v) { return v; } private static void identity() { } private static void assertEquals(Object o, Object o2) { if (!o.equals(o2)) throw new AssertionError("expected "+ o +" found "+o2); } public static void main(String[] args) throws Throwable { for(int i=0; i< 1000000; i++) { boolean dummyZ; byte dummyB; short dummyS; char dummyC; int dummyI; long dummyL; float dummyF; double dummyD; //dummyZ = (boolean)InvokeDynamic.foo(); // void -> boolean //dummyI = (int)InvokeDynamic.foo(); // void -> int //InvokeDynamic.foo(4); // int -> void InvokeDynamic.spread(4); // spread: int -> void //dummyF = (float)InvokeDynamic.foo(4); // int -> float //dummyD = (double)InvokeDynamic.foo(4); // int -> double //assertEquals(4.0f, (float)InvokeDynamic.foo(4)); // int -> float } } static { Linkage.registerBootstrapMethod("bootstrap"); } private static CallSite bootstrap(Class<?> declaring, String name, MethodType methodType) throws Throwable { Lookup lookup = MethodHandles.lookup(); MethodHandle mh; if (methodType.parameterCount() == 0) { mh = lookup.findStatic(ConvertTest.class, "identity", MethodType.methodType(void.class)); } else { Class<?> type = methodType.parameterType(0); mh = lookup.findStatic(ConvertTest.class, "identity", MethodType.methodType(type, type)); if ("spread".equals(name)) { mh = MethodHandles.spreadArguments(mh, methodType.changeParameterType(0, Object[].class)); mh = MethodHandles.collectArguments(mh, methodType); } } mh = mh.asType(methodType); CallSite cs = new CallSite(); cs.setTarget(mh); return cs; } } > -- Christian > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev