Example usage for org.objectweb.asm MethodVisitor visitLdcInsn

List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitLdcInsn.

Prototype

public void visitLdcInsn(final Object value) 

Source Link

Document

Visits a LDC instruction.

Usage

From source file:org.jacoco.core.runtime.AbstractRuntimeData.java

License:Open Source License

/**
 * Generates code that creates the argument array for the
 * {@link #getProbes(Object[])} method. The array instance is left on the
 * operand stack. The generated code requires a stack size of 5.
 * /*  www.  j  a  v a 2 s  .c  om*/
 * @param classid
 *            class identifier
 * @param classname
 *            VM class name
 * @param probecount
 *            probe count for this class
 * @param mv
 *            visitor to emit generated code
 */
public static void generateArgumentArray(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {
    mv.visitInsn(Opcodes.ICONST_3);
    mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");

    // Class Id:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitLdcInsn(Long.valueOf(classid));
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
    mv.visitInsn(Opcodes.AASTORE);

    // Class Name:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_1);
    mv.visitLdcInsn(classname);
    mv.visitInsn(Opcodes.AASTORE);

    // Probe Count:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_2);
    InstrSupport.push(mv, probecount);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
    mv.visitInsn(Opcodes.AASTORE);
}

From source file:org.jacoco.core.runtime.ExecutionDataAccess.java

License:Open Source License

/**
 * Generates code that creates the argument array for the
 * <code>getExecutionData()</code> method. The array instance is left on the
 * operand stack. The generated code requires a stack size of 5.
 * // ww  w . j ava 2  s .c o m
 * @param classid
 *            class identifier
 * @param classname
 *            VM class name
 * @param probecount
 *            probe count for this class
 * @param mv
 *            visitor to emit generated code
 */
public static void generateArgumentArray(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {
    mv.visitInsn(Opcodes.ICONST_3);
    mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");

    // Class Id:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitLdcInsn(Long.valueOf(classid));
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
    mv.visitInsn(Opcodes.AASTORE);

    // Class Name:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_1);
    mv.visitLdcInsn(classname);
    mv.visitInsn(Opcodes.AASTORE);

    // Probe Count:
    mv.visitInsn(Opcodes.DUP);
    mv.visitInsn(Opcodes.ICONST_2);
    InstrSupport.push(mv, probecount);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
    mv.visitInsn(Opcodes.AASTORE);
}

From source file:org.jacoco.core.runtime.LoggerRuntime.java

License:Open Source License

public int generateDataAccessor(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {

    // The data accessor performs the following steps:
    ///*  www .j  ava  2s  . c  o m*/
    // final Object[] args = new Object[3];
    // args[0] = Long.valueOf(classid);
    // args[1] = classname;
    // args[2] = Integer.valueOf(probecount);
    // Logger.getLogger(CHANNEL).log(Level.INFO, key, args);
    // final byte[] probedata = (byte[]) args[0];
    //
    // Note that local variable 'args' is used at two places. As were not
    // allowed to allocate local variables we have to keep this value with
    // DUP and SWAP operations on the operand stack.

    // 1. Create parameter array:

    RuntimeData.generateArgumentArray(classid, classname, probecount, mv);

    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.DUP);

    // Stack[1]: [Ljava/lang/Object;
    // Stack[0]: [Ljava/lang/Object;

    // 2. Call Logger:

    mv.visitLdcInsn(CHANNEL);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/logging/Logger", "getLogger",
            "(Ljava/lang/String;)Ljava/util/logging/Logger;");

    // Stack[2]: Ljava/util/logging/Logger;
    // Stack[1]: [Ljava/lang/Object;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.SWAP);

    // Stack[2]: [Ljava/lang/Object;
    // Stack[1]: Ljava/util/logging/Logger;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitFieldInsn(Opcodes.GETSTATIC, "java/util/logging/Level", "INFO", "Ljava/util/logging/Level;");

    // Stack[3]: Ljava/util/logging/Level;
    // Stack[2]: [Ljava/lang/Object;
    // Stack[1]: Ljava/util/logging/Logger;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.SWAP);

    // Stack[3]: [Ljava/lang/Object;
    // Stack[2]: Ljava/util/logging/Level;
    // Stack[1]: Ljava/util/logging/Logger;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitLdcInsn(key);

    // Stack[4]: Ljava/lang/String;
    // Stack[3]: [Ljava/lang/Object;
    // Stack[2]: Ljava/util/logging/Level;
    // Stack[1]: Ljava/util/logging/Logger;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.SWAP);

    // Stack[4]: [Ljava/lang/Object;
    // Stack[3]: Ljava/lang/String;
    // Stack[2]: Ljava/util/logging/Level;
    // Stack[1]: Ljava/util/logging/Logger;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/logging/Logger", "log",
            "(Ljava/util/logging/Level;Ljava/lang/String;[Ljava/lang/Object;)V");

    // Stack[0]: [Ljava/lang/Object;

    // 3. Load data structure from parameter array:

    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitInsn(Opcodes.AALOAD);
    mv.visitTypeInsn(Opcodes.CHECKCAST, InstrSupport.DATAFIELD_DESC);

    // Stack[0]: [Z

    return 5; // Maximum local stack size is 5
}

From source file:org.jacoco.core.runtime.OfflineInstrumentationAccessGenerator.java

License:Open Source License

public int generateDataAccessor(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {
    mv.visitLdcInsn(Long.valueOf(classid));
    mv.visitLdcInsn(classname);/*from w ww.  j  av a2 s. co m*/
    InstrSupport.push(mv, probecount);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeClassName, "getProbes", "(JLjava/lang/String;I)[Z");
    return 4;
}

From source file:org.jacoco.core.runtime.SystemPropertiesRuntime.java

License:Open Source License

public int generateDataAccessor(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "getProperties", "()Ljava/util/Properties;");

    // Stack[0]: Ljava/util/Properties;

    mv.visitLdcInsn(key);

    // Stack[1]: Ljava/lang/String;
    // Stack[0]: Ljava/util/Properties;

    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/Properties", "get",
            "(Ljava/lang/Object;)Ljava/lang/Object;");

    // Stack[0]: Ljava/lang/Object;

    RuntimeData.generateAccessCall(classid, classname, probecount, mv);

    // Stack[0]: [Z

    return 6; // Maximum local stack size is 3
}

From source file:org.jacoco.core.runtime.URLStreamHandlerRuntime.java

License:Open Source License

public int generateDataAccessor(final long classid, final String classname, final int probecount,
        final MethodVisitor mv) {

    // The data accessor performs the following steps:
    ///*from  ww  w .ja va2  s . c om*/
    // final URL url = new URL(protocol, null, "");
    // final URLConnection connection = url.openConnection();
    // final Object[] args = new Object[3];
    // args[0] = Long.valueOf(classid);
    // args[1] = classname;
    // args[2] = Integer.valueOf(probecount);
    // connection.equals(args);
    // final byte[] probedata = (byte[]) args[0];

    RuntimeData.generateArgumentArray(classid, classname, probecount, mv);
    mv.visitInsn(Opcodes.DUP);

    // Stack[1]: [Ljava/lang/Object;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitTypeInsn(Opcodes.NEW, "java/net/URL");
    mv.visitInsn(Opcodes.DUP);
    mv.visitLdcInsn(protocol);
    mv.visitInsn(Opcodes.ACONST_NULL);
    mv.visitLdcInsn("");
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/net/URL", "<init>",
            "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");

    // Stack[2]: [Ljava/net/URL;
    // Stack[1]: [Ljava/lang/Object;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/net/URL", "openConnection", "()Ljava/net/URLConnection;");

    // Stack[2]: [Ljava/net/URLConnection;
    // Stack[1]: [Ljava/lang/Object;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.SWAP);

    // Stack[2]: [Ljava/lang/Object;
    // Stack[1]: [Ljava/net/URLConnection;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z");

    // Stack[1]: Z;
    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.POP);

    // Stack[0]: [Ljava/lang/Object;

    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitInsn(Opcodes.AALOAD);
    mv.visitTypeInsn(Opcodes.CHECKCAST, InstrSupport.DATAFIELD_DESC);

    return 7;
}

From source file:org.jadira.reflection.access.asm.AsmClassAccess.java

License:Apache License

private static void enhanceForThrowingException(MethodVisitor mv, Class<? extends Exception> exceptionClass,
        String msg, String argType, int instruction, int slot) {

    String exceptionClassNm = Type.getInternalName(exceptionClass);
    mv.visitTypeInsn(NEW, exceptionClassNm);
    mv.visitInsn(DUP);//from ww  w.j a v  a2s.c  o m
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn(msg);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
    mv.visitVarInsn(instruction, slot);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(" + argType + ")Ljava/lang/StringBuilder;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
    mv.visitMethodInsn(INVOKESPECIAL, exceptionClassNm, "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);
}

From source file:org.jayware.e2.component.impl.generation.writer.ComponentCopyOtherMethodWriter.java

License:Open Source License

public void writeCopyOtherMethodFor(ComponentGenerationPlan componentPlan) {
    final Class<? extends Component> componentClass = componentPlan.getComponentClass();
    final ClassWriter classWriter = componentPlan.getClassWriter();

    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "copy",
            "(" + getDescriptor(Component.class) + ")" + getDescriptor(Component.class), null, null);
    final Label endIfNotInstanceOf = new Label();
    visitor.visitCode();/* w  ww  .j av a2 s  . co m*/
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitInsn(DUP);
    visitor.visitTypeInsn(INSTANCEOF, getInternalName(componentClass));
    visitor.visitJumpInsn(IFNE, endIfNotInstanceOf);
    visitor.visitTypeInsn(NEW, getInternalName(IllegalArgumentException.class));
    visitor.visitInsn(DUP);
    visitor.visitLdcInsn("Copy source type has to be: " + componentClass);
    visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(IllegalArgumentException.class), "<init>",
            "(" + getDescriptor(String.class) + ")V", false);
    visitor.visitInsn(ATHROW);
    visitor.visitLabel(endIfNotInstanceOf);
    visitor.visitTypeInsn(CHECKCAST, getInternalName(componentClass));
    visitor.visitVarInsn(ASTORE, 2);
    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();
        final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType());

        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitVarInsn(ALOAD, 2);
        visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(componentClass),
                propertyPlan.getPropertyGetterMethodName(), propertyPlan.getPropertyGetterMethodDescriptor(),
                true);

        final Label ifNotNull = new Label();
        final Label endIfNotNull = new Label();

        if (propertyType.isArray()) {
            visitor.visitVarInsn(ASTORE, 3);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitJumpInsn(IFNONNULL, ifNotNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIfNotNull);
            visitor.visitLabel(ifNotNull);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitInsn(ARRAYLENGTH);

            if (propertyType.getComponentType().isPrimitive()) {
                visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType()));
            } else {
                visitor.visitTypeInsn(ANEWARRAY, getInternalName(propertyType.getComponentType()));
            }

            visitor.visitVarInsn(ASTORE, 4);
            final Label endForLoop = new Label();
            final Label headForLoop = new Label();
            visitor.visitInsn(ICONST_0);
            visitor.visitVarInsn(ISTORE, 5);
            visitor.visitLabel(headForLoop);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitInsn(ARRAYLENGTH);
            visitor.visitJumpInsn(IF_ICMPGE, endForLoop);
            visitor.visitVarInsn(ALOAD, 4);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitVarInsn(ILOAD, 5);
            visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IALOAD));
            visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE));
            visitor.visitIincInsn(5, 1);
            visitor.visitJumpInsn(GOTO, headForLoop);
            visitor.visitLabel(endForLoop);
            visitor.visitVarInsn(ALOAD, 4);
        }

        visitor.visitLabel(endIfNotNull);
        visitor.visitFieldInsn(PUTFIELD, componentPlan.getGeneratedClassInternalName(), propertyName,
                propertyTypeDescriptor);
    }
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.jayware.e2.component.impl.generation.writer.ComponentGetMethodWriter.java

License:Open Source License

public void writeGetMethodFor(ComponentGenerationPlan componentPlan) {
    final String classInternalName = componentPlan.getGeneratedClassInternalName();
    final ClassWriter classWriter = componentPlan.getClassWriter();
    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "get",
            "(Ljava/lang/String;)Ljava/lang/String;", null, null);

    visitor.visitCode();/*  ww  w  . ja  v  a2s.  com*/

    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();
        final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType());

        final Label endIfPropertyNameEqualsLabel = new Label();

        visitor.visitLdcInsn(propertyName);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z",
                false);
        visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel);

        if (propertyType.isPrimitive()
                || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) {
            if (propertyType.isArray()) {
                visitor.visitVarInsn(ALOAD, 0);
                visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
                visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Arrays.class), "toString",
                        "(" + propertyTypeDescriptor + ")" + getDescriptor(String.class), false);
            } else {
                visitor.visitVarInsn(ALOAD, 0);
                visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
                visitor.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                        "(" + propertyTypeDescriptor + ")Ljava/lang/String;", false);
            }
        } else if (propertyType.isEnum()) {
            final Label ifEnumValueNonNull = new Label();
            final Label endIf = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
            visitor.visitVarInsn(ASTORE, 2);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIf);
            visitor.visitLabel(ifEnumValueNonNull);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Enum.class), "name", "()Ljava/lang/String;",
                    false);
            visitor.visitLabel(endIf);
        } else if (String.class.equals(propertyType)) {
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
        } else if (!propertyType.isPrimitive()
                || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) {
            final Label endIfAdapterNull = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager",
                    getDescriptor(ComponentManager.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class),
                    "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")"
                            + getDescriptor(ComponentPropertyAdapter.class),
                    true);
            visitor.visitVarInsn(ASTORE, 2);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull);
            visitor.visitTypeInsn(NEW, getInternalName(ComponentMarshalException.class));
            visitor.visitInsn(DUP);
            visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '"
                    + propertyType.getName() + "'");
            visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentMarshalException.class), "<init>",
                    "(" + getDescriptor(String.class) + ")V", false);
            visitor.visitInsn(ATHROW);
            visitor.visitLabel(endIfAdapterNull);
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor);
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class), "marshal",
                    "(" + getDescriptor(Context.class) + getDescriptor(Object.class) + ")"
                            + getDescriptor(String.class),
                    true);
        } else {
            throw new ComponentFactoryException();
        }

        visitor.visitInsn(ARETURN);
        visitor.visitLabel(endIfPropertyNameEqualsLabel);
    }

    visitor.visitInsn(ACONST_NULL);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.jayware.e2.component.impl.generation.writer.ComponentSetMethodWriter.java

License:Open Source License

public void writeSetMethodFor(ComponentGenerationPlan componentPlan) {
    final String classInternalName = componentPlan.getGeneratedClassInternalName();
    final ClassWriter classWriter = componentPlan.getClassWriter();

    final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "set",
            "(Ljava/lang/String;Ljava/lang/String;)Z", null, null);
    visitor.visitCode();/*  ww w  . j a v  a2  s.co m*/

    for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) {
        final String propertyName = propertyPlan.getPropertyName();
        final Class<?> propertyType = propertyPlan.getPropertyType();

        final Label endIfPropertyNameEqualsLabel = new Label();

        visitor.visitLdcInsn(propertyName);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z",
                false);
        visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel);
        visitor.visitVarInsn(ALOAD, 0);

        if (propertyType.isPrimitive()
                || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) {
            if (!propertyType.isArray()) {
                visitor.visitVarInsn(ALOAD, 2);

                if (boolean.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean",
                            "(Ljava/lang/String;)Z", false);
                } else if (byte.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte",
                            "(Ljava/lang/String;)B", false);
                } else if (short.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort",
                            "(Ljava/lang/String;)S", false);
                } else if (int.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt",
                            "(Ljava/lang/String;)I", false);
                } else if (float.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat",
                            "(Ljava/lang/String;)F", false);
                } else if (double.class.equals(propertyType)) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble",
                            "(Ljava/lang/String;)D", false);
                }
            } else {
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitInsn(ICONST_1);
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "length", "()I", false);
                visitor.visitInsn(ICONST_1);
                visitor.visitInsn(ISUB);
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "substring",
                        "(II)" + getDescriptor(String.class), false);
                visitor.visitVarInsn(ASTORE, 2);
                visitor.visitVarInsn(ALOAD, 2);
                visitor.visitLdcInsn(", ");
                visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "split",
                        "(" + getDescriptor(String.class) + ")[" + getDescriptor(String.class), false);
                visitor.visitVarInsn(ASTORE, 3);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitInsn(ARRAYLENGTH);
                visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType()));
                visitor.visitVarInsn(ASTORE, 4);
                final Label endForLoop = new Label();
                final Label headForLoop = new Label();
                visitor.visitInsn(ICONST_0);
                visitor.visitVarInsn(ISTORE, 5);
                visitor.visitLabel(headForLoop);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitInsn(ARRAYLENGTH);
                visitor.visitJumpInsn(IF_ICMPGE, endForLoop);
                visitor.visitVarInsn(ALOAD, 4);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitVarInsn(ALOAD, 3);
                visitor.visitVarInsn(ILOAD, 5);
                visitor.visitInsn(AALOAD);

                if (boolean.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean",
                            "(Ljava/lang/String;)Z", false);
                } else if (byte.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte",
                            "(Ljava/lang/String;)B", false);
                } else if (short.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort",
                            "(Ljava/lang/String;)S", false);
                } else if (int.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt",
                            "(Ljava/lang/String;)I", false);
                } else if (float.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat",
                            "(Ljava/lang/String;)F", false);
                } else if (double.class.equals(propertyType.getComponentType())) {
                    visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble",
                            "(Ljava/lang/String;)D", false);
                }

                visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE));

                visitor.visitIincInsn(5, 1);
                visitor.visitJumpInsn(GOTO, headForLoop);
                visitor.visitLabel(endForLoop);
                visitor.visitVarInsn(ALOAD, 4);
            }
        } else if (propertyType.isEnum()) {
            final Label ifEnumValueNonNull = new Label();
            final Label endIf = new Label();
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull);
            visitor.visitInsn(ACONST_NULL);
            visitor.visitJumpInsn(GOTO, endIf);
            visitor.visitLabel(ifEnumValueNonNull);
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Enum.class), "valueOf",
                    "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", false);
            visitor.visitTypeInsn(CHECKCAST, getInternalName(propertyType));
            visitor.visitLabel(endIf);
        } else if (String.class.equals(propertyType)) {
            visitor.visitVarInsn(ALOAD, 2);
        } else if (!propertyType.isPrimitive()
                || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) {
            final Label endIfAdapterNull = new Label();
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager",
                    getDescriptor(ComponentManager.class));
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitLdcInsn(getType(propertyType));
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class),
                    "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")"
                            + getDescriptor(ComponentPropertyAdapter.class),
                    true);
            visitor.visitVarInsn(ASTORE, 3);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull);
            visitor.visitTypeInsn(NEW, getInternalName(ComponentUnmarshalException.class));
            visitor.visitInsn(DUP);
            visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '"
                    + propertyType.getName() + "'");
            visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentUnmarshalException.class), "<init>",
                    "(" + getDescriptor(String.class) + ")V", false);
            visitor.visitInsn(ATHROW);
            visitor.visitLabel(endIfAdapterNull);
            visitor.visitVarInsn(ALOAD, 3);
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext",
                    getDescriptor(Context.class));
            visitor.visitVarInsn(ALOAD, 2);
            visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class),
                    "unmarshal", "(" + getDescriptor(Context.class) + getDescriptor(String.class) + ")"
                            + getDescriptor(Object.class),
                    true);
            visitor.visitTypeInsn(CHECKCAST, getType(propertyType).getInternalName());
        } else {
            throw new ComponentFactoryException();
        }

        visitor.visitFieldInsn(PUTFIELD, classInternalName, propertyName,
                Type.getDescriptor(propertyPlan.getPropertyType()));
        visitor.visitInsn(ICONST_1);
        visitor.visitInsn(IRETURN);
        visitor.visitLabel(endIfPropertyNameEqualsLabel);
    }

    visitor.visitInsn(ICONST_0);
    visitor.visitInsn(IRETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}