List of usage examples for org.objectweb.asm MethodVisitor visitMethodInsn
public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor, final boolean isInterface)
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
/** * Generate value encoding using the blink output. * * <p>Defaults to <code>writeUInt8[Null].</code> * * @param required true if the field is required, otherwise false. * @param mv the method visitor, not null. * @see #generateEncodeValue/*from w w w. ja v a2s. c om*/ */ protected void generateEncodeUInt8Value(boolean required, MethodVisitor mv) { if (required) { mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt8", "(Lcom/cinnober/msgcodec/io/ByteSink;B)V", false); } else { mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt8Null", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Byte;)V", false); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
/** * Generate value encoding using the blink output. * * <p>Defaults to <code>writeInt8[Null].</code> * * @param required true if the field is required, otherwise false. * @param mv the method visitor, not null. * @see #generateEncodeValue//from w ww.ja v a2s .co m */ protected void generateEncodeInt8Value(boolean required, MethodVisitor mv) { if (required) { mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt8", "(Lcom/cinnober/msgcodec/io/ByteSink;B)V", false); } else { mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt8Null", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Byte;)V", false); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
/** * Generate value encoding using the blink output. * * <p>Defaults to <code>writeDynamicGroup[Null]</code> in the generated codec. * * @param required true if the field is required, otherwise false. * @param mv the method visitor, not null. * @see #generateEncodeValue//w ww.ja v a2 s .c o m */ protected void generateEncodeDynRefValue(LocalVariable nextVar, MethodVisitor mv, boolean required) { // PENDING: validate that the instance class is a subclass of refGroup (unless null) int instanceVar = nextVar.next(); mv.visitVarInsn(ASTORE, instanceVar); mv.visitVarInsn(ALOAD, 0); // this mv.visitInsn(SWAP); // this and out mv.visitVarInsn(ALOAD, instanceVar); if (required) { mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "writeDynamicGroup", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Object;)V", false); } else { mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "writeDynamicGroupNull", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Object;)V", false); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateEncodeRefValue(GroupDef refGroup, boolean required, LocalVariable nextVar, MethodVisitor mv, String genClassInternalName, int outputStreamVar, TypeDef.Reference type, boolean javaClassCodec) throws IllegalArgumentException { if (refGroup != null) { Object refGroupType = refGroup.getGroupType(); String refGroupDescriptor = getTypeDescriptor(refGroupType, javaClassCodec); if (required) { int instanceVar = nextVar.next(); mv.visitVarInsn(ASTORE, instanceVar); mv.visitVarInsn(ALOAD, 0); // this mv.visitInsn(SWAP); // this and out mv.visitVarInsn(ALOAD, instanceVar); mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "writeStaticGroup_" + refGroup.getName(), "(Lcom/cinnober/msgcodec/io/ByteSink;" + refGroupDescriptor + ")V", false); } else {// w w w . j a v a2 s. co m int instanceVar = nextVar.next(); mv.visitInsn(DUP); Label nonNullLabel = new Label(); Label endLabel = new Label(); mv.visitJumpInsn(IFNONNULL, nonNullLabel); // null mv.visitInsn(POP); mv.visitInsn(ICONST_0); // false mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writePresenceByte", "(Lcom/cinnober/msgcodec/io/ByteSink;Z)V", false); mv.visitJumpInsn(GOTO, endLabel); // not null mv.visitLabel(nonNullLabel); // PENDING: mv.visitFrame? mv.visitVarInsn(ASTORE, instanceVar); mv.visitInsn(ICONST_1); // true mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writePresenceByte", "(Lcom/cinnober/msgcodec/io/ByteSink;Z)V", false); mv.visitVarInsn(ALOAD, 0); // this mv.visitVarInsn(ALOAD, outputStreamVar); mv.visitVarInsn(ALOAD, instanceVar); mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "writeStaticGroup_" + refGroup.getName(), "(Lcom/cinnober/msgcodec/io/ByteSink;" + refGroupDescriptor + ")V", false); mv.visitLabel(endLabel); // PENDING: mv.visitFrame? } } else { throw new IllegalArgumentException("Illegal reference: " + type); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateEncodeSequenceValue(Class<?> javaClass, LocalVariable nextVar, MethodVisitor mv, boolean required, int outputStreamVar, Class<?> componentJavaClass, TypeDef type, Schema schema, String genClassInternalName, String fieldIdentifier, String debugValueLabel, boolean javaClassCodec) throws IllegalArgumentException { // PENDING: merge the two if-cases, and reuse common code blocks (see generateDecodeSquenceValue) if (javaClass.isArray()) { int sequenceVar = nextVar.next(); mv.visitInsn(DUP);/*ww w.ja v a 2s. c o m*/ mv.visitVarInsn(ASTORE, sequenceVar); int lengthVar = nextVar.next(); Label endLabel = new Label(); if (required) { mv.visitInsn(ARRAYLENGTH); mv.visitInsn(DUP); mv.visitVarInsn(ISTORE, lengthVar); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32", "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false); } else { Label nonNullLabel = new Label(); mv.visitInsn(DUP); mv.visitJumpInsn(IFNONNULL, nonNullLabel); // null mv.visitInsn(POP); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeNull", "(Lcom/cinnober/msgcodec/io/ByteSink;)V", false); mv.visitJumpInsn(GOTO, endLabel); // not null mv.visitLabel(nonNullLabel); // PENDING: mv.visitFrame? mv.visitInsn(ARRAYLENGTH); mv.visitInsn(DUP); mv.visitVarInsn(ISTORE, lengthVar); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32", "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false); } // for loop int loopVar = nextVar.next(); mv.visitInsn(ICONST_0); mv.visitVarInsn(ISTORE, loopVar); Label loopLabel = new Label(); mv.visitLabel(loopLabel); // PENDING: mv.visitFrame? mv.visitVarInsn(ILOAD, loopVar); mv.visitVarInsn(ILOAD, lengthVar); mv.visitJumpInsn(IF_ICMPGE, endLabel); mv.visitVarInsn(ALOAD, outputStreamVar); mv.visitVarInsn(ALOAD, sequenceVar); mv.visitVarInsn(ILOAD, loopVar); if (componentJavaClass == byte.class || componentJavaClass == boolean.class) { mv.visitInsn(BALOAD); } else if (componentJavaClass == short.class) { mv.visitInsn(SALOAD); } else if (componentJavaClass == int.class) { mv.visitInsn(IALOAD); } else if (componentJavaClass == long.class) { mv.visitInsn(LALOAD); } else if (componentJavaClass == float.class) { mv.visitInsn(FALOAD); } else if (componentJavaClass == double.class) { mv.visitInsn(DALOAD); } else if (componentJavaClass == char.class) { mv.visitInsn(CALOAD); } else { mv.visitInsn(AALOAD); mv.visitTypeInsn(CHECKCAST, Type.getInternalName(componentJavaClass)); } // encode the element TypeDef.Sequence seqType = (TypeDef.Sequence) type; generateEncodeValue(mv, outputStreamVar, nextVar, true, seqType.getComponentType(), componentJavaClass, null, schema, genClassInternalName, fieldIdentifier, debugValueLabel + ".component", javaClassCodec); mv.visitIincInsn(loopVar, 1); mv.visitJumpInsn(GOTO, loopLabel); mv.visitLabel(endLabel); // PENDING: mv.visitFrame? } else if (javaClass == List.class) { int sequenceVar = nextVar.next(); mv.visitInsn(DUP); mv.visitVarInsn(ASTORE, sequenceVar); int lengthVar = nextVar.next(); Label endLabel = new Label(); if (required) { mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true); mv.visitInsn(DUP); mv.visitVarInsn(ISTORE, lengthVar); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32", "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false); } else { Label nonNullLabel = new Label(); mv.visitInsn(DUP); mv.visitJumpInsn(IFNONNULL, nonNullLabel); // null mv.visitInsn(POP); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeNull", "(Lcom/cinnober/msgcodec/io/ByteSink;)V", false); mv.visitJumpInsn(GOTO, endLabel); // not null mv.visitLabel(nonNullLabel); // PENDING: mv.visitFrame? mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true); mv.visitInsn(DUP); mv.visitVarInsn(ISTORE, lengthVar); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32", "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false); } // for loop, using iterator int iteratorVar = nextVar.next(); mv.visitVarInsn(ALOAD, sequenceVar); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;", true); mv.visitVarInsn(ASTORE, iteratorVar); Label loopLabel = new Label(); mv.visitLabel(loopLabel); // PENDING: mv.visitFrame? mv.visitVarInsn(ALOAD, iteratorVar); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true); mv.visitJumpInsn(IFEQ, endLabel); mv.visitVarInsn(ALOAD, outputStreamVar); mv.visitVarInsn(ALOAD, iteratorVar); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); if (componentJavaClass.isPrimitive()) { mv.visitTypeInsn(CHECKCAST, Type.getInternalName(box(componentJavaClass))); unbox(mv, componentJavaClass); } else { mv.visitTypeInsn(CHECKCAST, Type.getInternalName(componentJavaClass)); } // encode the element TypeDef.Sequence seqType = (TypeDef.Sequence) type; generateEncodeValue(mv, outputStreamVar, nextVar, true, seqType.getComponentType(), componentJavaClass, null, schema, genClassInternalName, fieldIdentifier, debugValueLabel + ".component", javaClassCodec); mv.visitJumpInsn(GOTO, loopLabel); mv.visitLabel(endLabel); // PENDING: mv.visitFrame? } else { throw new IllegalArgumentException("Illegal sequence javaClass: " + javaClass); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateEncodeTimeValue(TypeDef.Time type, Class<?> javaClass, boolean required, MethodVisitor mv) throws RuntimeException { if (javaClass == long.class || javaClass == Long.class) { generateEncodeInt64Value(required, mv); } else if (javaClass == int.class || javaClass == Integer.class) { generateEncodeInt32Value(required, mv); } else if (javaClass == Date.class) { Label nullLabel = new Label(); Label endLabel = new Label(); if (!required) { mv.visitInsn(DUP);/* www. ja v a2 s .c o m*/ mv.visitJumpInsn(IFNULL, nullLabel); } // not null mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/Date", "getTime", "()J", false); // handle differences in UNIT and EPOCH long epochOffset = DateUtil.getEpochOffset(type.getEpoch()); long timeInMillis = DateUtil.getTimeInMillis(type.getUnit()); // wireTime = (dateTime - epochOffset) / timeUnitInMillis); if (epochOffset != 0) { mv.visitLdcInsn(epochOffset); mv.visitInsn(LSUB); } if (timeInMillis != 1) { mv.visitLdcInsn(timeInMillis); mv.visitInsn(LDIV); } box(mv, long.class); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt64Null", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Long;)V", false); if (!required) { mv.visitJumpInsn(GOTO, endLabel); mv.visitLabel(nullLabel); mv.visitInsn(POP); mv.visitInsn(ACONST_NULL); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt64Null", "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Long;)V", false); mv.visitLabel(endLabel); } } else { throw new IllegalArgumentException("Illegal time javaClass: " + javaClass); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateEncodeEnumValue(TypeDef.Enum enumType, String genClassInternalName, String fieldIdentifier, LocalVariable nextVar, Class<?> javaClass, boolean required, MethodVisitor mv, String debugValueLabel) throws IllegalArgumentException { Label writeValueLabel = new Label(); // Make sure that no unsupported javaClass is used for an enum if (javaClass != int.class && javaClass != Integer.class && (javaClass == null || !javaClass.isEnum())) { throw new IllegalArgumentException("Illegal enum javaClass: " + javaClass); }// www .j av a2 s . c o m // If null do not look it up if (!required) { Label lookupIdLabel = new Label(); mv.visitInsn(DUP); mv.visitJumpInsn(IFNONNULL, lookupIdLabel); // null mv.visitInsn(POP); mv.visitInsn(ACONST_NULL); mv.visitJumpInsn(GOTO, writeValueLabel); // not null mv.visitLabel(lookupIdLabel); } // SymbolMapping if (required && !javaClass.isEnum()) { box(mv, int.class); } mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, genClassInternalName, "symbolMapping_" + fieldIdentifier, "Lcom/cinnober/msgcodec/SymbolMapping;"); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEINTERFACE, "com/cinnober/msgcodec/SymbolMapping", "getId", "(Ljava/lang/Object;)Ljava/lang/Integer;", true); // Write the value mv.visitLabel(writeValueLabel); if (required) { unbox(mv, Integer.class); // TODO: Should null check before this and throw exception since there was no mapping } generateEncodeInt32Value(required, mv); // if (javaClass.isEnum()) { // Label endLabel = new Label(); // if (!required) { // Label nonNullLabel = new Label(); // mv.visitInsn(DUP); // mv.visitJumpInsn(IFNONNULL, nonNullLabel); // // null // mv.visitInsn(POP); // mv.visitInsn(ACONST_NULL); // mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt32Null", // "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Integer;)V", false); // mv.visitJumpInsn(GOTO, endLabel); // // not null // mv.visitLabel(nonNullLabel); // } // mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Enum", "ordinal", "()I", false); // //switch // EnumSymbols enumSymbols = new EnumSymbols(enumType, javaClass); // Enum[] enumValues = ((Class<Enum>)javaClass).getEnumConstants(); // int[] ordinals = new int[enumValues.length]; // Label[] labels = new Label[enumValues.length]; // for (int i=0; i<enumValues.length; i++) { // ordinals[i] = i; // labels[i] = new Label(); // } // Label defaultLabel = new Label(); // Label writeLabel = new Label(); // int symbolIdVar = nextVar.next(); // mv.visitLookupSwitchInsn(defaultLabel, ordinals, labels); // for (int i=0; i<enumValues.length; i++) { // mv.visitLabel(labels[i]); // Symbol symbol = enumSymbols.getSymbol(enumValues[i]); // if (symbol != null) { // mv.visitLdcInsn(symbol.getId()); // mv.visitJumpInsn(GOTO, writeLabel); // } else { // mv.visitLdcInsn(debugValueLabel); // mv.visitVarInsn(ALOAD, symbolIdVar); // mv.visitMethodInsn(INVOKESTATIC, baseclassIName, "unmappableEnumSymbolValue", // "(Ljava/lang/String;Ljava/lang/Enum;)Ljava/lang/IllegalArgumentException;", false); // mv.visitInsn(ATHROW); // } // } // mv.visitLabel(defaultLabel); // mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); // mv.visitInsn(DUP); // mv.visitLdcInsn("Should not happen: reached generated switch default case for value " + debugValueLabel); // mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false); // mv.visitInsn(ATHROW); // // // write // mv.visitLabel(writeLabel); // if (!required) { // box(mv, int.class); // } // generateEncodeInt32Value(required, mv); // // end // mv.visitLabel(endLabel); // } else if (javaClass == int.class || javaClass == Integer.class) { // generateEncodeInt32Value(required, mv); // } else { // throw new IllegalArgumentException("Illegal enum javaClass: " + javaClass); // } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateDecodeDummy(MethodVisitor mv, int byteSourceVar, LocalVariable nextVar, boolean required, TypeDef type, Class<?> javaClass, Class<?> componentJavaClass, Schema schema, String genClassInternalName, String debugValueLabel, boolean javaClassCodec) { type = schema.resolveToType(type, false); switch (type.getType()) { case ENUM://from w w w. j a va 2s. c om if (required) { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32", "(Lcom/cinnober/msgcodec/io/ByteSource;)I", false); } else { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32Null", "(Lcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Integer;", false); } break; default: generateDecodeValue(mv, byteSourceVar, nextVar, required, type, javaClass, componentJavaClass, schema, genClassInternalName, null, debugValueLabel, javaClassCodec); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
/** * Generate value decoding using the blink input. * * <p>Defaults to <code>readBoolean[Null].</code> * * @param required true if the field is required, otherwise false. * @param mv the method visitor, not null. * @see #generateDecodeValue// w w w. j a v a2 s .c o m */ protected void generateDecodeBooleanValue(boolean required, MethodVisitor mv) { if (required) { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBoolean", "(Lcom/cinnober/msgcodec/io/ByteSource;)Z", false); } else { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBooleanNull", "(Lcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Boolean;", false); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
/** * Generate value decoding using the blink input. * * <p>Defaults to <code>readBinary[Null].</code> * * @param required true if the field is required, otherwise false. * @param mv the method visitor, not null. * @see #generateDecodeValue// w ww . jav a2 s .c om */ protected void generateDecodeBinaryValue(TypeDef.Binary type, MethodVisitor mv, boolean required) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "getMaxBinarySize", "()I", false); if (required) { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBinary", "(Lcom/cinnober/msgcodec/io/ByteSource;I)[B", false); } else { mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBinaryNull", "(Lcom/cinnober/msgcodec/io/ByteSource;I)[B", false); } }