static { MethodHandle target = MethodHandles.lookup() .findVirtual( DynamicMethod.class, "call", MethodType.make( IRubyObject.class, ThreadContext.class, IRubyObject.class, RubyModule.class, String.class, IRubyObject.class, IRubyObject.class, Block.class)); target = MethodHandles.convertArguments( target, MethodType.make( IRubyObject.class, DynamicMethod.class, ThreadContext.class, IRubyObject.class, RubyClass.class, String.class, IRubyObject.class, IRubyObject.class, Block.class)); target = MethodHandles.permuteArguments( target, MethodType.make( IRubyObject.class, DynamicMethod.class, RubyClass.class, CacheEntry.class, ThreadContext.class, IRubyObject.class, IRubyObject.class, String.class, IRubyObject.class, IRubyObject.class, Block.class), new int[] {0, 3, 5, 1, 6, 7, 8, 9}); // IRubyObject, DynamicMethod, RubyClass, CacheEntry, ThreadContext, IRubyObject, IRubyObject, // String, args target = MethodHandles.foldArguments(target, GETMETHOD_2_B); // IRubyObject, RubyClass, CacheEntry, ThreadContext, IRubyObject, IRubyObject, String, args target = MethodHandles.foldArguments(target, PGC_2_B); // IRubyObject, CacheEntry, ThreadContext, IRubyObject, IRubyObject, String, args MethodHandle breakJump = dropNameAndArgs(BREAKJUMP, 5, 2, true); MethodHandle retryJump = dropNameAndArgs(RETRYJUMP, 5, 2, true); target = MethodHandles.catchException(target, JumpException.BreakJump.class, breakJump); target = MethodHandles.catchException(target, JumpException.RetryJump.class, retryJump); TARGET_2_B = target; }
static { MethodHandle target = MethodHandles.lookup() .findVirtual( DynamicMethod.class, "call", MethodType.make( IRubyObject.class, ThreadContext.class, IRubyObject.class, RubyModule.class, String.class, IRubyObject.class, IRubyObject.class, IRubyObject.class)); target = MethodHandles.convertArguments( target, MethodType.make( IRubyObject.class, DynamicMethod.class, ThreadContext.class, IRubyObject.class, RubyClass.class, String.class, IRubyObject.class, IRubyObject.class, IRubyObject.class)); target = MethodHandles.permuteArguments( target, MethodType.make( IRubyObject.class, DynamicMethod.class, RubyClass.class, CacheEntry.class, ThreadContext.class, IRubyObject.class, IRubyObject.class, String.class, IRubyObject.class, IRubyObject.class, IRubyObject.class), new int[] {0, 3, 5, 1, 6, 7, 8, 9}); // IRubyObject, DynamicMethod, RubyClass, CacheEntry, ThreadContext, IRubyObject, IRubyObject, // String, args target = MethodHandles.foldArguments(target, GETMETHOD_3); // IRubyObject, RubyClass, CacheEntry, ThreadContext, IRubyObject, IRubyObject, String, args target = MethodHandles.foldArguments(target, PGC_3); // IRubyObject, CacheEntry, ThreadContext, IRubyObject, IRubyObject, String, args TARGET_3 = target; }
private static MethodHandle createGWT( MethodHandle test, MethodHandle target, MethodHandle fallback, CacheEntry entry, CallSite site) { MethodHandle myTest = MethodHandles.insertArguments(test, 0, entry); MethodHandle myTarget = MethodHandles.insertArguments(target, 0, entry); MethodHandle myFallback = MethodHandles.insertArguments(fallback, 0, site); MethodHandle guardWithTest = MethodHandles.guardWithTest(myTest, myTarget, myFallback); return MethodHandles.convertArguments(guardWithTest, site.type()); }