View Javadoc

1   package org.softevo.jdynpur.runtime;
2   
3   import org.objectweb.asm.MethodAdapter;
4   import org.objectweb.asm.MethodVisitor;
5   import org.objectweb.asm.Opcodes;
6   
7   public class ConstructorPurityTracingVisitor extends MethodAdapter implements Opcodes {
8   
9   	private String superClassName = null;
10  
11  	private String className = null;
12  
13  	private boolean isConstructor = false;
14  
15  	public ConstructorPurityTracingVisitor(MethodVisitor methodVisitor, String methodName, String className,
16  	                                       String superClassName) {
17  		super(methodVisitor);
18  		this.superClassName = superClassName;
19  		this.className = className;
20  		isConstructor = methodName.equals("<init>");
21  	}
22  
23  	public void visitMethodInsn(int opCode, String owner, String name, String desc) {
24  		if (isConstructor && (opCode == INVOKESPECIAL) && name.equals("<init>")
25  				&& (owner.equals(className) || owner.equals(superClassName))) {
26  			// System.out.println("Found call to this or super constructor");
27  			super.visitMethodInsn(opCode, owner, name, desc);
28  			super.visitVarInsn(ALOAD, 0);
29  			super
30  			.visitMethodInsn(INVOKESTATIC, OnTheFlyInstrumenter.TRACECLASSNAME, "objectCreated", "(Ljava/lang/Object;)V");
31  		} else {
32  			super.visitMethodInsn(opCode, owner, name, desc);
33  		}
34  	}
35  }