/* * Copyright (C) 2014 Zhang,Yuexiang (xfeep) * All rights reserved. */ package nginx.clojure.wave; import nginx.clojure.asm.Opcodes; import nginx.clojure.asm.tree.MethodNode; import nginx.clojure.wave.MethodDatabase.ClassEntry; public class InstrumentMethodNode extends MethodNode { MethodDatabase db; public InstrumentMethodNode() { } public InstrumentMethodNode(int api) { super(api); } public InstrumentMethodNode(MethodDatabase db, int access, String name, String desc, String signature, String[] exceptions) { super(Opcodes.ASM4, access, name, desc, signature, exceptions); this.db = db; } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { if (name.charAt(0) == '<' && name.charAt(1) == 'i' && db != null && db.checkMethodSuspendType(owner, ClassEntry.key(name, desc), false, false) == MethodDatabase.SUSPEND_NORMAL) { super.visitInsn(Opcodes.ACONST_NULL); super.visitMethodInsn(opcode, owner, name, InstrumentConstructorMethod.buildShrinkedInitMethodDesc(desc)); super.visitInsn(Opcodes.DUP); super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, InstrumentConstructorMethod.buildInitHelpMethodName(desc), "()V"); }else { super.visitMethodInsn(opcode, owner, name, desc); } } @Override public void visitMaxs(int maxStack, int maxLocals) { super.visitMaxs(maxStack + 1, maxLocals + 1); } public MethodDatabase getDb() { return db; } public void setDb(MethodDatabase db) { this.db = db; } }