package org.nutz.aop.asm;
import java.lang.reflect.Method;
import org.nutz.repo.org.objectweb.asm.Label;
import org.nutz.repo.org.objectweb.asm.MethodVisitor;
import org.nutz.repo.org.objectweb.asm.Type;
/**
*
* @author wendal(wendal1985@gmail.com)
*
*/
class AopInvokeAdpter extends AopMethodAdapter {
Method[] methodArray;
AopInvokeAdpter( Method[] methodArray,
MethodVisitor mv,
int access,
String methodName,
String desc,
int methodIndex,
String myName,
String enhancedSuperName) {
super(mv, access, methodName, desc, methodIndex, myName, enhancedSuperName);
this.methodArray = methodArray;
}
void visitCode() {
mv.visitCode();
for (int i = 0; i < methodArray.length; i++) {
Method method = methodArray[i];
mv.visitVarInsn(ILOAD, 1);
visitX(i);
Label l0 = new Label();
mv.visitJumpInsn(IF_ICMPNE, l0);
mv.visitVarInsn(ALOAD, 0);
Type[] args = Type.getArgumentTypes(method);
for (int j = 0; j < args.length; j++) {
mv.visitVarInsn(ALOAD, 2);
visitX(j);
mv.visitInsn(AALOAD);
returnType = args[j];
AsmHelper.checkCast(returnType,mv);
}
mv.visitMethodInsn( INVOKESPECIAL,
enhancedSuperName,
method.getName(),
Type.getMethodDescriptor(method));
{
returnType = Type.getReturnType(method);
if (returnType.equals(Type.VOID_TYPE))
mv.visitInsn(ACONST_NULL);
else if (returnType.getOpcode(IRETURN) != ARETURN)
AsmHelper.packagePrivateData(returnType,mv);
mv.visitInsn(ARETURN);
}
mv.visitLabel(l0);
}
mv.visitInsn(ACONST_NULL);
mv.visitInsn(ARETURN);
mv.visitMaxs(4, 3);
mv.visitEnd();
}
}