/** * Compares the instrumentation level interval against the runtime value. * * <p>If the runtime value is fitting the level interval there will be 0 on stack upon return from * this method. Otherwise there will be -1. * * @param clsName The probe class name * @param level The probe instrumentation level * @return itself */ public Assembler compareLevel(String clsName, Level level) { Interval itv = level.getValue(); if (itv.getA() <= 0) { if (itv.getB() != Integer.MAX_VALUE) { ldc(itv.getB()); getStatic(clsName, "$btrace$$level", Type.INT_TYPE.getDescriptor()); sub(Type.INT_TYPE); } } else if (itv.getA() < itv.getB()) { if (itv.getB() == Integer.MAX_VALUE) { getStatic(clsName, "$btrace$$level", Type.INT_TYPE.getDescriptor()); ldc(itv.getA()); sub(Type.INT_TYPE); } else { Label l1 = new Label(); Label l2 = new Label(); ldc(itv.getA()); jump(Opcodes.IF_ICMPLT, l1); getStatic(clsName, "$btrace$$level", Type.INT_TYPE.getDescriptor()); ldc(itv.getB()); jump(Opcodes.IF_ICMPGT, l1); ldc(0); jump(Opcodes.GOTO, l2); label(l1); ldc(-1); label(l2); } } return this; }
public Assembler addLevelCheck(String clsName, Interval itv, Label jmp) { getStatic(clsName, "$btrace$$level", Type.INT_TYPE.getDescriptor()); if (itv.getA() <= 0) { if (itv.getB() != Integer.MAX_VALUE) { ldc(itv.getB()); jump(Opcodes.IF_ICMPGT, jmp); } } else if (itv.getA() < itv.getB()) { if (itv.getB() == Integer.MAX_VALUE) { ldc(itv.getA()); jump(Opcodes.IF_ICMPLT, jmp); } else { ldc(itv.getA()); jump(Opcodes.IF_ICMPLT, jmp); getStatic(clsName, "$btrace$$level", Type.INT_TYPE.getDescriptor()); ldc(itv.getB()); jump(Opcodes.IF_ICMPGT, jmp); } } return this; }