// 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(); } }
@Override public SourceValue naryOperation( final AbstractInsnNode insn, final List<? extends SourceValue> values) { int size; int opcode = insn.getOpcode(); if (opcode == MULTIANEWARRAY) { size = 1; } else { String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc : ((MethodInsnNode) insn).desc; size = Type.getReturnType(desc).getSize(); } return new SourceValue(size, insn); }