List of usage examples for org.objectweb.asm MethodVisitor visitLabel
public void visitLabel(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);/* w w w . ja v a2 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 www . j av a 2 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;// w ww . ja va2 s . 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;/* w w w .j av a 2 s. c o m*/ 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 a v 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 ww. 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 ww w .ja va2 s. c o m 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:// ww w . j av a 2s .c om * 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:net.wpm.reflectasm.ClassAccess.java
License:Open Source License
private static void insertNewInstance(ClassWriter cw, String classNameInternal, ClassInfo info) { MethodVisitor mv; mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "newInstance", "(I[Ljava/lang/Object;)Ljava/lang/Object;", null, null);//www.j a va 2s . c om mv.visitCode(); int n = info.constructorModifiers.length; if (n != 0) { mv.visitVarInsn(ILOAD, 1); Label[] labels = new Label[n]; for (int i = 0; i < n; i++) labels[i] = new Label(); Label defaultLabel = new Label(); mv.visitTableSwitchInsn(0, labels.length - 1, defaultLabel, labels); StringBuilder buffer = new StringBuilder(128); for (int i = 0; i < n; i++) { mv.visitLabel(labels[i]); if (i == 0) mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { classNameInternal }, 0, null); else mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); mv.visitTypeInsn(NEW, classNameInternal); mv.visitInsn(DUP); buffer.setLength(0); buffer.append('('); Class<?>[] paramTypes = info.constructorParameterTypes[i]; for (int paramIndex = 0; paramIndex < paramTypes.length; paramIndex++) { mv.visitVarInsn(ALOAD, 2); mv.visitIntInsn(BIPUSH, paramIndex); mv.visitInsn(AALOAD); Type paramType = Type.getType(paramTypes[paramIndex]); unbox(mv, paramType); buffer.append(paramType.getDescriptor()); } buffer.append(")V"); mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "<init>", buffer.toString(), false); mv.visitInsn(ARETURN); } mv.visitLabel(defaultLabel); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); } mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitLdcInsn("Constructor not found: "); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); mv.visitVarInsn(ILOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(0, 0); mv.visitEnd(); }