why the field can't be printed and so many redundancy

lucefe <[email protected]>
Newsgroups gmane.comp.java.objectweb.asm
Message-ID <[email protected]>
*Hi, everybody,

    I want to instrument a method:*
* from*
   public void m() throws Exception{
        Thread.sleep(100);
    }

*to*

    public void m() throws Exception{
        timer -= System.currentTimeMillis();
        Thread.sleep(100);
        timer += System.currentTimeMillis();
        System.out.println(timer);
    }

*my classAdapter is attached, when I use the next code:*

ByteArrayOutputStream stream = new ByteArrayOutputStream();
                PrintWriter printWriter = new PrintWriter(stream);
                ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                TraceClassVisitor tcv = new TraceClassVisitor(cw,
printWriter);
                AddTimerAdapter ca = new AddTimerAdapter(tcv);
                AddTimerMethodAdapter ma =
ca.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V", null, null);
                ma.visitCode();
                ma.visitInsn(Opcodes.RETURN);
                ma.visitMaxs(4, 1);
                ma.visitEnd();
                ca.visitEnd();
                cr.accept(ca, ClassReader.SKIP_DEBUG);
                System.out.println(stream);

*I got the following result. There were so many redundancy, and the field
timer was not printed as I wanted. who can tell me where is my error.*

// class version 49.0 (49)
// access flags 33
public class pkg/C {


  // access flags 9
  public static J timer

  // access flags 1
  public <init>()V

  // access flags 1
  public m()V throws java/lang/Exception
    GETSTATIC pkg/C.timer : J
    INVOKESTATIC java/lang/System.currentTimeMillis ()J
    LSUB
    PUTSTATIC pkg/C.timer : J
    GETSTATIC pkg/C.timer : J
    INVOKESTATIC java/lang/System.currentTimeMillis ()J
    LSUB
    PUTSTATIC pkg/C.timer : J
    LDC 100
    INVOKESTATIC java/lang/Thread.sleep (J)V
    GETSTATIC pkg/C.timer : J
    INVOKESTATIC java/lang/System.currentTimeMillis ()J
    LADD
    PUTSTATIC pkg/C.timer : J
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    GETSTATIC pkg/C.timer : J
    INVOKEVIRTUAL java/io/PrintStream.println (J)V
    GETSTATIC pkg/C.timer : J
    INVOKESTATIC java/lang/System.currentTimeMillis ()J
    LADD
    PUTSTATIC pkg/C.timer : J
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    GETSTATIC pkg/C.timer : J
    INVOKEVIRTUAL java/io/PrintStream.println (J)V
    RETURN
    MAXSTACK = 8
    MAXLOCALS = 1

  // access flags 9
  public static J timer
}
AddTimerAdapter.java (text/x-java, 3.1 KB)
package ch3;

import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ACC_STATIC;
import static org.objectweb.asm.Opcodes.ATHROW;
import static org.objectweb.asm.Opcodes.GETSTATIC;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.IRETURN;
import static org.objectweb.asm.Opcodes.LADD;
import static org.objectweb.asm.Opcodes.LSUB;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
import static org.objectweb.asm.Opcodes.RETURN;

import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;

/**
 * ASM Guide example class.
 * 
 * @author Eric Bruneton
 */
public class AddTimerAdapter extends ClassAdapter {

  private String owner;

  private boolean isInterface;

  public AddTimerAdapter(ClassVisitor cv) {
    super(cv);
  }

  public void visit(int version, int access, String name,
      String signature, String superName, String[] interfaces) {
    cv.visit(version, access, name, signature, superName, interfaces);
    owner = name;
    isInterface = (access & ACC_INTERFACE) != 0;
  }

  public AddTimerMethodAdapter visitMethod(int access, String name,
      String desc, String signature, String[] exceptions) {
    MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
        exceptions);
    AddTimerMethodAdapter ma;
    if (!isInterface && mv != null && !name.equals("<init>")) {
      ma = new AddTimerMethodAdapter(mv);
      return ma;
    }
    return null;
  }

  public void visitEnd() {
    if (!isInterface) {
      FieldVisitor fv = cv.visitField(ACC_PUBLIC + ACC_STATIC, "timer",
          "J", null, null);
      if (fv != null) {
        fv.visitEnd();
      }
    }
    cv.visitEnd();
  }

  public class AddTimerMethodAdapter extends MethodAdapter {

    public AddTimerMethodAdapter(MethodVisitor mv) {
      super(mv);
    }

    public void visitCode() {
      mv.visitCode();
      mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
      mv.visitMethodInsn(INVOKESTATIC, "java/lang/System",
          "currentTimeMillis", "()J");
      mv.visitInsn(LSUB);
      mv.visitFieldInsn(PUTSTATIC, owner, "timer", "J");
    }

    public void visitInsn(int opcode) {
      if ((opcode == IRETURN || opcode == RETURN) || opcode == ATHROW) {
        mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/System",
            "currentTimeMillis", "()J");
        mv.visitInsn(LADD);
        mv.visitFieldInsn(PUTSTATIC, owner, "timer", "J");
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V");
        
      }
      mv.visitInsn(opcode);
    }

    public void visitMaxs(int maxStack, int maxLocals) {
      mv.visitMaxs(maxStack + 4, maxLocals);
    }
  }
}
message-footer.txt (text/plain, 238 B)
-- 
You receive this message as a subscriber of the [email protected] mailing list.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=help
OW2 mailing lists service home page: http://www.ow2.org/wws
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.