@Override public void visitMethodStmt(Op op, int[] args, Method method, Proto proto) { if (args.length > 0) { if (op.format == InstructionFormat.kFmt4rcc) { // invoke-x/range out.s("%s { %s .. %s }, %s, %s", op.displayName, reg(args[0]), reg(args[args.length - 1]), BaksmaliDumper.escapeMethod(method), BaksmaliDumper.escapeMethodDesc(proto)); } else { boolean first = true; StringBuilder buff = new StringBuilder(); for (int i : args) { if (first) { first = false; } else { buff.append(", "); } buff.append(reg(i)); } out.s("%s { %s }, %s, %s", op.displayName, buff, BaksmaliDumper.escapeMethod(method), BaksmaliDumper.escapeMethodDesc(proto)); } } else { out.s("%s { }, %s, %s", op.displayName, BaksmaliDumper.escapeMethod(method), BaksmaliDumper.escapeMethodDesc(proto)); } }
@Override public void visitMethodStmt(Op op, int[] args, Method method) { if (args.length > 0) { if (op.format == InstructionFormat.kFmt3rc) { // invoke-x/range out.s("%s { %s .. %s }, %s", op.displayName, reg(args[0]), reg(args[args.length - 1]), BaksmaliDumper.escapeMethod(method)); } else { boolean first = true; StringBuilder buff = new StringBuilder(); for (int i : args) { if (first) { first = false; } else { buff.append(", "); } buff.append(reg(i)); } out.s("%s { %s }, %s", op.displayName, buff, BaksmaliDumper.escapeMethod(method)); } } else { out.s("%s { }, %s", op.displayName, BaksmaliDumper.escapeMethod(method)); } }
return escapeMethod((Method) obj);
private static String escapeMethodHandle(MethodHandle obj) { switch (obj.getType()) { case MethodHandle.INSTANCE_GET: return ".iget " + escapeField(obj.getField()); case MethodHandle.INSTANCE_PUT: return ".iput " + escapeField(obj.getField()); case MethodHandle.STATIC_GET: return ".sget " + escapeField(obj.getField()); case MethodHandle.STATIC_PUT: return ".sput " + escapeField(obj.getField()); case MethodHandle.INVOKE_INSTANCE: return ".invoke-instance " + escapeMethod(obj.getMethod()); case MethodHandle.INVOKE_STATIC: return ".invoke-static " + escapeMethod(obj.getMethod()); case MethodHandle.INVOKE_CONSTRUCTOR: return ".invoke-constructor " + escapeMethod(obj.getMethod()); case MethodHandle.INVOKE_DIRECT: return ".invoke-direct " + escapeMethod(obj.getMethod()); case MethodHandle.INVOKE_INTERFACE: return ".invoke-interface " + escapeMethod(obj.getMethod()); default: } return "?"; }