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
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 }