package com.ikokoon.serenity.instrumentation.coverage;
import org.apache.log4j.Logger;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import com.ikokoon.toolkit.Toolkit;
/**
* @see CoverageClassAdapterExt
* @author Michael Couck
* @since 19.01.10
* @version 01.00
*/
public class CoverageMethodAdapterExt extends MethodAdapter {
private Logger logger = Logger.getLogger(CoverageMethodAdapterExt.class);
private String className;
private String linesArrayName;
private String linesArrayDescription;
public static int lines = 0;
public CoverageMethodAdapterExt(MethodVisitor methodVisitor, String className, String linesArrayName, String linesArrayDescription) {
super(methodVisitor);
this.className = Toolkit.slashToDot(className);
this.linesArrayName = linesArrayName;
this.linesArrayDescription = linesArrayDescription;
logger.debug("Class name : " + className + ", lines array name : " + linesArrayName + ", lines array desc : " + linesArrayDescription);
}
public void visitLineNumber(int lineNumber, Label label) {
// At each line increment the line counter for the line
mv.visitFieldInsn(Opcodes.GETSTATIC, Toolkit.dotToSlash(className), linesArrayName, linesArrayDescription);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.DUP2);
mv.visitInsn(Opcodes.IALOAD);
mv.visitInsn(Opcodes.ICONST_1);
mv.visitInsn(Opcodes.IADD);
mv.visitInsn(Opcodes.IASTORE);
mv.visitLineNumber(lineNumber, label);
lines = Math.max(lines, lineNumber);
}
}