public static boolean methodDescsCloseEnough(String mightHaveVMState, String desc) {
    Type[] d1 = Type.getArgumentTypes(mightHaveVMState);
    Type[] d2 = Type.getArgumentTypes(desc);
    if (Arrays.deepEquals(d1, d2)) return true;
    if (d1[d1.length - 1].getInternalName().equals(Type.getInternalName(VMState.class))) {

      if (d1.length - 1 != d2.length) return false;
      for (int i = 0; i < d1.length - 1; i++) if (!d1[i].equals(d2[i])) return false;
      return true;
    }
    return false;
  }
  //	private static Logger log = Logger.getLogger(InvivoAdapter.class);
  public InvivoAdapter(
      int api,
      MethodVisitor mv,
      int access,
      String name,
      String desc,
      String className,
      boolean generateReverseStub) {
    //		super(api, mv, access, name, desc);
    super(mv);
    this.access = access;
    this.name = name;
    this.desc = desc;
    this.className = className;

    Type[] args = Type.getArgumentTypes(desc);
    firstLocal = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0;
    for (int i = 0; i < args.length; i++) {
      firstLocal += args[i].getSize();
    }
    sandboxVar = isMain() || isClinit() ? getFirstLocal() : getFirstLocal() - 1;

    if (generateReverseStub) {
      GeneratorAdapter gv = new GeneratorAdapter(mv, access, name, desc);
      gv.visitCode();
      gv.loadThis();
      for (int i = 0; i < args.length - 1; i++) {
        gv.loadArg(i);
      }
      Type[] args2 = new Type[args.length - 1];
      System.arraycopy(args, 0, args2, 0, args.length - 1);
      gv.visitMethodInsn(
          INVOKEVIRTUAL,
          className,
          name.substring(1),
          Type.getMethodDescriptor(Type.getReturnType(desc), args2),
          false);
      //			switch(Type.getReturnType(desc).getSort())
      //			{
      //			case Type.ARRAY:
      //			case Type.OBJECT:
      //				gv.visitLdcInsn(null);
      //			break;
      //			case Type.VOID:
      //				break;
      //			default:
      //				gv.push(0);
      //			}
      gv.returnValue();
      gv.visitMaxs(0, 0);
      //			mv.visitEnd();
    }
  }