List of usage examples for org.objectweb.asm MethodVisitor visitJumpInsn
public void visitJumpInsn(final int opcode, final Label label)
From source file:mt.swift.Serializer.java
License:Apache License
private void generateWriteMap(MethodVisitor methodVisitor, FrameRegisterManager context, MapType mapType) { // top of stack is list we're serializing int mapSlot = context.newAnonymousSlot(); methodVisitor.visitVarInsn(ASTORE, mapSlot); // protocol.writeListBegin(new TList(ttype, object.size)) methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol")); methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TMap"); methodVisitor.visitInsn(DUP);//from w ww . j av a 2 s . co m pushValue(methodVisitor, mapType.getKeyType().getTType()); pushValue(methodVisitor, mapType.getValueType().getTType()); methodVisitor.visitVarInsn(ALOAD, mapSlot); methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "size", "()I"); methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TMap", "<init>", "(BBI)V"); methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeMapBegin", "(Lcom/facebook/thrift/protocol/TMap;)V"); // at this point, stack is empty // for (element : value), using a while (iterator.hasNext()) { ... } loop methodVisitor.visitVarInsn(ALOAD, mapSlot); methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "entrySet", "()Ljava/util/Set;"); methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;"); // TODO: generalize generateIterator method to take a callback to generate the code for processing each // element Label loopLabel = new Label(); Label doneLabel = new Label(); methodVisitor.visitLabel(loopLabel); methodVisitor.visitInsn(DUP); // for iterator.hasNext() methodVisitor.visitInsn(DUP); // for iterator.next() // iterator.hasNext? methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z"); methodVisitor.visitJumpInsn(IFEQ, doneLabel); // if hasNext returned false (0), we're done methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;"); // element is Map.Entry methodVisitor.visitInsn(DUP); // for entry.getKey int entrySlot = context.newAnonymousSlot(); methodVisitor.visitVarInsn(ASTORE, entrySlot); // for entry.getValue methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getKey", "()Ljava/lang/Object;"); generateCast(methodVisitor, mapType.getKeyType()); generateWriteElement(methodVisitor, context, mapType.getKeyType()); methodVisitor.visitVarInsn(ALOAD, entrySlot); methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getValue", "()Ljava/lang/Object;"); generateCast(methodVisitor, mapType.getValueType()); generateWriteElement(methodVisitor, context, mapType.getValueType()); context.release(entrySlot); methodVisitor.visitJumpInsn(GOTO, loopLabel); methodVisitor.visitLabel(doneLabel); methodVisitor.visitInsn(POP); // lingering reference to iterator // protocol.writeSetEnd() methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol")); methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeMapEnd", "()V"); context.release(mapSlot); }
From source file:mt.swift.Serializer.java
License:Apache License
/** * Generates code to write the elements of an iterator, one after another * * Assumes iterator is at top of stack//from w ww . j a va2 s . c o m * * @param methodVisitor * @param context * @param elementType */ private void generateWriteIteratorElements(MethodVisitor methodVisitor, FrameRegisterManager context, Type elementType) { Label loopLabel = new Label(); Label doneLabel = new Label(); methodVisitor.visitLabel(loopLabel); methodVisitor.visitInsn(DUP); // for iterator.hasNext() methodVisitor.visitInsn(DUP); // for iterator.next() // iterator.hasNext? methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z"); methodVisitor.visitJumpInsn(IFEQ, doneLabel); // if hasNext returned false (0), we're done methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;"); generateCast(methodVisitor, elementType); generateWriteElement(methodVisitor, context, elementType); methodVisitor.visitJumpInsn(GOTO, loopLabel); methodVisitor.visitLabel(doneLabel); methodVisitor.visitInsn(POP); // lingering reference to iterator methodVisitor.visitInsn(POP); // lingering reference to iterator }
From source file:net.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java
License:Open Source License
private void buildItemDispatchMethods(ClassWriter cw) { String classname = "SVDBPersistenceDelegate"; String full_classname = transform_cls(fTargetPkg) + "/" + classname; Label labels[] = new Label[SVDBItemType.values().length]; int indexes[] = new int[SVDBItemType.values().length]; Label dflt, endcase;/*from www . j a va 2s . c o m*/ for (int i = 0; i < SVDBItemType.values().length; i++) { indexes[i] = i; } // writeItem Dispatch method MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "writeSVDBItem", "(L" + getClassName(ISVDBItemBase.class) + ";)V", null, new String[] { fDBWriteException }); for (int i = 0; i < SVDBItemType.values().length; i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Retrieve the object type mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR); mv.visitMethodInsn(INVOKEINTERFACE, getClassName(ISVDBItemBase.class), "getType", "()L" + getClassName(SVDBItemType.class) + ";"); mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); for (SVDBItemType t : SVDBItemType.values()) { Class c = fTypeClassMap.get(t); mv.visitLabel(labels[t.ordinal()]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR); mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn(INVOKESPECIAL, full_classname, "write" + t.name(), "(L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); } mv.visitLabel(dflt); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(16, 16); mv.visitEnd(); // readItem dispatch method mv = cw.visitMethod( ACC_PUBLIC, "readSVDBItem", "(L" + getClassName(SVDBItemType.class) + ";L" + getClassName(ISVDBChildItem.class) + ";)L" + getClassName(ISVDBItemBase.class) + ";", null, new String[] { fDBWriteException }); for (int i = 0; i < SVDBItemType.values().length; i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); mv.visitVarInsn(ALOAD, 1); // object type mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); for (SVDBItemType t : SVDBItemType.values()) { Class c = fTypeClassMap.get(t); mv.visitLabel(labels[t.ordinal()]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // parent mv.visitMethodInsn(INVOKESPECIAL, full_classname, "read" + t.name(), "(L" + getClassName(ISVDBChildItem.class) + ";)" + "L" + getClassName(c) + ";"); mv.visitJumpInsn(GOTO, endcase); } mv.visitLabel(dflt); mv.visitInsn(ACONST_NULL); mv.visitLabel(endcase); mv.visitInsn(ARETURN); mv.visitMaxs(16, 16); mv.visitEnd(); }
From source file:net.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java
License:Open Source License
private void buildObjectDispatchMethods(ClassWriter cw) { String classname = "SVDBPersistenceDelegate"; String full_classname = transform_cls(fTargetPkg) + "/" + classname; int idx;// ww w .j a v a2 s.com Label labels[] = new Label[fClassList.size()]; int indexes[] = new int[fClassList.size()]; Label dflt, endcase; for (int i = 0; i < fClassList.size(); i++) { indexes[i] = i; } // writeItem Dispatch method MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "writeObject", "(L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V", null, new String[] { fDBWriteException }); for (int i = 0; i < fClassList.size(); i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Find the object index mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitFieldInsn(GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";"); // Class parameter // fObjectList field mv.visitVarInsn(ALOAD, 1); // cls parameter mv.visitMethodInsn(INVOKEINTERFACE, getClassName(List.class), "indexOf", "(L" + getClassName(Object.class) + ";)I"); // Index now on the stack mv.visitLookupSwitchInsn(dflt, indexes, labels); idx = 0; for (Class c : fClassList) { mv.visitLabel(labels[idx]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // object mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn(INVOKESPECIAL, full_classname, "write" + getClassLeafName(c), "(L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); idx++; } mv.visitLabel(dflt); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // object mv.visitMethodInsn(INVOKESPECIAL, full_classname, "writeObjectErr", "(L" + getClassName(Object.class) + ";)V"); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(16, 16); mv.visitEnd(); // readItem dispatch method mv = cw.visitMethod( ACC_PUBLIC, "readObject", "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V", null, new String[] { fDBWriteException }); for (int i = 0; i < fClassList.size(); i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Find the object index mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitFieldInsn(GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";"); // Class parameter // fObjectList field mv.visitVarInsn(ALOAD, 2); // cls parameter mv.visitMethodInsn(INVOKEINTERFACE, getClassName(List.class), "indexOf", "(L" + getClassName(Object.class) + ";)I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); idx = 0; for (Class c : fClassList) { mv.visitLabel(labels[idx]); // mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 1); // parent mv.visitVarInsn(ALOAD, 3); // object mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn(INVOKESPECIAL, full_classname, "read" + getClassLeafName(c), "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); idx++; } mv.visitLabel(dflt); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 3); // object mv.visitMethodInsn(INVOKESPECIAL, full_classname, "readObjectErr", "(L" + getClassName(Object.class) + ";)V"); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(4, 4); mv.visitEnd(); }
From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java
License:GNU General Public License
public void generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable( MethodVisitor nextMethodVisitor, Integer neededJumpCounterIdVariableValue, Integer counterIdToIncrement, int lastJumpIdVariableIndex, String className) { nextMethodVisitor.visitLdcInsn((int) neededJumpCounterIdVariableValue); nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex); Label afterJump = new Label(); nextMethodVisitor.visitJumpInsn(Opcodes.IF_ICMPNE, afterJump); generateCodeThatIncrementsCoberturaCounter(nextMethodVisitor, counterIdToIncrement, className); generateCodeThatZeroJumpCounterIdVariable(nextMethodVisitor, lastJumpIdVariableIndex); nextMethodVisitor.visitLabel(afterJump); }
From source file:net.sourceforge.cobertura.instrument.pass3.AtomicArrayCodeProvider.java
License:GNU General Public License
public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) { mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); Label l1 = new Label(); mv.visitJumpInsn(Opcodes.IFNONNULL, l1); mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(AtomicIntegerArray.class)); mv.visitInsn(Opcodes.DUP);//from w ww . j av a2 s . c o m mv.visitLdcInsn(counters_cnt); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(AtomicIntegerArray.class), "<init>", "(I)V"); mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); generateRegisterClass(mv, className); mv.visitLabel(l1); }
From source file:net.sourceforge.cobertura.instrument.pass3.AtomicArrayCodeProvider.java
License:GNU General Public License
/** * <pre>/*from w w w . ja v a 2 s.c o m*/ * int[] __cobertura_get_and_reset_counters() { * int[] res = new int[counters.length()]; * for(int i=0; i<counters.length(); i++){ * res[i]=counters.getAndSet(i, 0); * } * return res; * } * </pre> */ public void generateCoberturaGetAndResetCountersMethod(ClassVisitor cv, String className) { MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME, "()[I", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length", "()I"); mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); mv.visitVarInsn(Opcodes.ASTORE, 0); mv.visitInsn(Opcodes.ICONST_0); mv.visitVarInsn(Opcodes.ISTORE, 1); Label l3 = new Label(); mv.visitJumpInsn(Opcodes.GOTO, l3); Label l4 = new Label(); mv.visitLabel(l4); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitInsn(Opcodes.ICONST_0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "getAndSet", "(II)I"); mv.visitInsn(Opcodes.IASTORE); mv.visitIincInsn(1, 1); mv.visitLabel(l3); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length", "()I"); mv.visitJumpInsn(Opcodes.IF_ICMPLT, l4); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(0, 0);//will be recalculated by writer mv.visitEnd(); }
From source file:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java
License:GNU General Public License
public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) { mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); Label l1 = new Label(); mv.visitJumpInsn(Opcodes.IFNONNULL, l1); mv.visitLdcInsn(counters_cnt);/*from w ww . j a v a 2s.com*/ mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); generateRegisterClass(mv, className); mv.visitLabel(l1); }
From source file:net.sourceforge.cobertura.instrument.pass3.TestUnitCodeProvider.java
License:GNU General Public License
/** * Generates://from w w w .j av a 2s. c o m * public static void __cobertura_init() * { * if (__cobertura_counters == null) * { * __cobertura_counters = new TestUnitInformationHolder[class.length]; * } * TouchCollector.registerClass("mypackage/HelloWorld"); * } */ public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) { mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); Label l1 = new Label(); mv.visitJumpInsn(Opcodes.IFNONNULL, l1); mv.visitLdcInsn(counters_cnt); mv.visitTypeInsn(Opcodes.ANEWARRAY, Type.getInternalName(TestUnitInformationHolder.class)); mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitInsn(ICONST_0); mv.visitVarInsn(ISTORE, 1); Label l11 = new Label(); mv.visitLabel(l11); Label l2 = new Label(); mv.visitJumpInsn(GOTO, l2); Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(24, l3); mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.INTEGER }, 0, null); mv.visitFieldInsn(GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitVarInsn(ILOAD, 1); mv.visitTypeInsn(NEW, "net/sourceforge/cobertura/coveragedata/TestUnitInformationHolder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "net/sourceforge/cobertura/coveragedata/TestUnitInformationHolder", "<init>", "()V"); mv.visitInsn(AASTORE); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLineNumber(23, l4); mv.visitIincInsn(1, 1); mv.visitLabel(l2); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); mv.visitVarInsn(ILOAD, 1); mv.visitFieldInsn(GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); mv.visitInsn(ARRAYLENGTH); mv.visitJumpInsn(IF_ICMPLT, l3); mv.visitLabel(l1); generateRegisterClass(mv, className); }
From source file:one.nio.http.gen.RequestHandlerGenerator.java
License:Apache License
private void convertArgument(MethodVisitor mv, Class type, boolean needNullCheck) { if (type == String.class) { return; // nothing to do }/*from www . j a v a2 s. c o m*/ if (type.isPrimitive()) { if (type == int.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "parseInt", "(Ljava/lang/String;)I"); } else if (type == long.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "parseLong", "(Ljava/lang/String;)J"); } else if (type == byte.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "parseByte", "(Ljava/lang/String;)B"); } else if (type == short.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "parseShort", "(Ljava/lang/String;)S"); } else if (type == float.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "parseFloat", "(Ljava/lang/String;)F"); } else if (type == double.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "parseDouble", "(Ljava/lang/String;)D"); } else if (type == boolean.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "parseBoolean", "(Ljava/lang/String;)Z"); } else if (type == char.class) { mv.visitInsn(ICONST_0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C"); } return; } Label isNull = new Label(); if (needNullCheck) { Label nonNull = new Label(); mv.visitInsn(DUP); mv.visitJumpInsn(IFNONNULL, nonNull); mv.visitInsn(POP); mv.visitInsn(ACONST_NULL); mv.visitJumpInsn(GOTO, isNull); mv.visitLabel(nonNull); } if (type == Integer.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(Ljava/lang/String;)Ljava/lang/Integer;"); } else if (type == Long.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(Ljava/lang/String;)Ljava/lang/Long;"); } else if (type == Byte.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(Ljava/lang/String;)Ljava/lang/Byte;"); } else if (type == Short.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(Ljava/lang/String;)Ljava/lang/Short;"); } else if (type == Float.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(Ljava/lang/String;)Ljava/lang/Float;"); } else if (type == Double.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(Ljava/lang/String;)Ljava/lang/Double;"); } else if (type == Boolean.class) { mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Ljava/lang/String;)Ljava/lang/Boolean;"); } else { throw new IllegalArgumentException("Unsupported argument type: " + type.getName()); } if (needNullCheck) { mv.visitLabel(isNull); } }