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