List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
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(); }