ARTIFICIAL RENAISSANCE INNER SELF E
IKVM - реализация Java для Mono и Microsoft .NET Framevork.
Invokedynamic Proof of Concept
Original
Реализованна инструкция invokedynamic. Пример работы :
class InvokeDynamicPoC { private static InvokeDynamic __bootstrapMethod = bootstrapInvokeDynamic; private static CallSiteImpl> __site1 = new CallSiteImpl>( new StaticContextImpl(typeof(InvokeDynamicPoC), "printSubstring")); private static void Main() { for (int j = 0; j < 2; j++) { int start = Environment.TickCount; for (int i = 0; i < 10/*0000000/**/; i++) { string obj = "invokedynamic"; int arg1 = 3; int arg2 = 2; MethodHandleImpl> mh = __site1.mh; if (mh == null) { __bootstrapMethod(__site1, obj, new object[] { java.lang.Integer.valueOf(arg1), java.lang.Integer.valueOf(arg2) }); } else { mh.d(obj, arg1, arg2); } } int end = Environment.TickCount; Console.WriteLine(end - start); } } private static void printSubstring(string s, int startIndex, int length) { Console.WriteLine(s.Substring(startIndex, length)); } private static object bootstrapInvokeDynamic(CallSite cs, object receiver, object[] arguments) { java.lang.Class c = typeof(InvokeDynamicPoC); java.lang.reflect.Method m = c.getDeclaredMethod(cs.getStaticContext().getName(), typeof(string), typeof(int), typeof(int)); MethodHandle mh = MethodHandles.unreflect(m); cs.setTarget(mh); return m.invoke(null, receiver, arguments[0], arguments[1]); } }