private static <T> void appendInit( DelayedCellSetterFactory<T, ?>[] delayedCellSetters, CellSetter<T>[] setters, ClassWriter cw, String targetType, String classType, int maxSize) { MethodVisitor mv; // constructor { mv = cw.visitMethod( ACC_PUBLIC, "<init>", "(" + AsmUtils.toDeclaredLType(Instantiator.class) + AsmUtils.toDeclaredLType(DelayedCellSetter[].class) + AsmUtils.toDeclaredLType(CellSetter[].class) + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContext.class) + AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class) + ")V", "(" + "L" + AsmUtils.toType(Instantiator.class) + "<L" + AsmUtils.toType(CsvMapperCellHandler.class) + "<L" + targetType + ";>;L" + targetType + ";>;" + "[L" + DELAYED_CELL_SETTER_TYPE + "<L" + targetType + ";*>;" + "[L" + CELL_SETTER_TYPE + "<L" + targetType + ";>;" + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContext.class) + "L" + AsmUtils.toType(FieldMapperErrorHandler.class) + "<L" + AsmUtils.toType(CsvColumnKey.class) + ";>;" + ")V", null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 2); mv.visitInsn(ARRAYLENGTH); mv.visitVarInsn(ALOAD, 3); mv.visitInsn(ARRAYLENGTH); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 6); mv.visitMethodInsn( INVOKESPECIAL, CSV_CELL_MAPPER_TYPE, "<init>", "(" + AsmUtils.toDeclaredLType(Instantiator.class) + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + "I" + "I" + AsmUtils.toDeclaredLType(ParsingContext.class) + AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class) + ")V", false); ShardingHelper.shard( delayedCellSetters.length, maxSize, new ShardingHelper.ShardCallBack() { @Override public void leafDispatch(String suffix, int start, int end) {} @Override public void nodeDispatch(String suffix, int divide, int start, int end) {} }); for (int i = 0; i < delayedCellSetters.length; i++) { if (delayedCellSetters[i] != null) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 2); AsmUtils.addIndex(mv, i); mv.visitInsn(AALOAD); mv.visitFieldInsn( PUTFIELD, classType, "delayedCellSetter" + i, AsmUtils.toDeclaredLType(DELAYED_CELL_SETTER_TYPE)); } } for (int i = 0; i < setters.length; i++) { if (setters[i] != null) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 3); AsmUtils.addIndex(mv, i); mv.visitInsn(AALOAD); mv.visitFieldInsn( PUTFIELD, classType, "setter" + i, AsmUtils.toDeclaredLType(CELL_SETTER_TYPE)); } } mv.visitInsn(RETURN); mv.visitMaxs(7, 7); mv.visitEnd(); } }
public static byte[] createTargetSetterFactory(String factoryName, String className, Type target) throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); MethodVisitor mv; String factoryType = AsmUtils.toType(factoryName); String classType = AsmUtils.toType(className); String targetType = AsmUtils.toType(target); cw.visit( V1_6, ACC_FINAL + ACC_PUBLIC + ACC_SUPER, factoryType, "L" + CELL_HANDLER_FACTORY_TYPE + "<L" + targetType + ";>;", CELL_HANDLER_FACTORY_TYPE, null); { mv = cw.visitMethod( ACC_PUBLIC, "<init>", "(" + AsmUtils.toDeclaredLType(Instantiator.class) + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContextFactory.class) + AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class) + ")V", "(" + "L" + AsmUtils.toType(Instantiator.class) + "<L" + AsmUtils.toType(CsvMapperCellHandler.class) + "<L" + targetType + ";>;L" + targetType + ";>;" + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContextFactory.class) + "L" + AsmUtils.toType(FieldMapperErrorHandler.class) + "<L" + AsmUtils.toType(CsvColumnKey.class) + ";>;" + ")V", null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn( INVOKESPECIAL, CELL_HANDLER_FACTORY_TYPE, "<init>", "(" + AsmUtils.toDeclaredLType(Instantiator.class) + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContextFactory.class) + AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class) + ")V", false); mv.visitInsn(RETURN); mv.visitMaxs(5, 5); mv.visitEnd(); } { mv = cw.visitMethod( ACC_PUBLIC, "newInstance", "(" + AsmUtils.toDeclaredLType(DelayedCellSetter[].class) + AsmUtils.toDeclaredLType(CellSetter[].class) + ")" + AsmUtils.toDeclaredLType(CsvMapperCellHandler.class), "(" + "[L" + DELAYED_CELL_SETTER_TYPE + "<L" + targetType + ";*>;" + "[L" + CELL_SETTER_TYPE + "<L" + targetType + ";>;" + ")" + "L" + AsmUtils.toType(CsvMapperCellHandler.class) + "<L" + targetType + ";>;", null); mv.visitCode(); mv.visitTypeInsn(NEW, classType); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn( GETFIELD, factoryType, "instantiator", AsmUtils.toDeclaredLType(Instantiator.class)); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn( GETFIELD, factoryType, "keys", AsmUtils.toDeclaredLType(CsvColumnKey[].class)); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn( GETFIELD, factoryType, "parsingContextFactory", AsmUtils.toDeclaredLType(ParsingContextFactory.class)); mv.visitMethodInsn( INVOKEVIRTUAL, AsmUtils.toType(ParsingContextFactory.class), "newContext", "()" + AsmUtils.toDeclaredLType(ParsingContext.class), false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn( GETFIELD, factoryType, "fieldErrorHandler", AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class)); mv.visitMethodInsn( INVOKESPECIAL, classType, "<init>", "(" + AsmUtils.toDeclaredLType(Instantiator.class) + AsmUtils.toDeclaredLType(DelayedCellSetter[].class) + AsmUtils.toDeclaredLType(CellSetter[].class) + AsmUtils.toDeclaredLType(CsvColumnKey[].class) + AsmUtils.toDeclaredLType(ParsingContext.class) + AsmUtils.toDeclaredLType(FieldMapperErrorHandler.class) + ")V", false); mv.visitInsn(ARETURN); mv.visitMaxs(8, 3); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }
public static <T> byte[] createTargetSetterClass( String className, DelayedCellSetterFactory<T, ?>[] delayedCellSetters, CellSetter<T>[] setters, Type type, boolean ignoreException, int maxMethodSize) throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); FieldVisitor fv; MethodVisitor mv; final String targetType = AsmUtils.toType(type); final String classType = AsmUtils.toType(className); cw.visit( V1_6, ACC_FINAL + ACC_PUBLIC + ACC_SUPER, classType, "L" + CSV_CELL_MAPPER_TYPE + "<L" + targetType + ";>;", CSV_CELL_MAPPER_TYPE, null); // declare fields for (int i = 0; i < delayedCellSetters.length; i++) { if (delayedCellSetters[i] != null) { fv = cw.visitField( ACC_PROTECTED + ACC_FINAL, "delayedCellSetter" + i, AsmUtils.toDeclaredLType(DELAYED_CELL_SETTER_TYPE), "L" + DELAYED_CELL_SETTER_TYPE + "<L" + targetType + ";*>;", null); fv.visitEnd(); } } for (int i = 0; i < setters.length; i++) { if (setters[i] != null) { fv = cw.visitField( ACC_PROTECTED + ACC_FINAL, "setter" + i, AsmUtils.toDeclaredLType(CELL_SETTER_TYPE), "L" + CELL_SETTER_TYPE + "<L" + targetType + ";>;", null); fv.visitEnd(); } } appendInit(delayedCellSetters, setters, cw, targetType, classType, maxMethodSize); appendDelayedCellValue(delayedCellSetters, ignoreException, cw, classType); append_delayedCellValue(delayedCellSetters, cw, classType, maxMethodSize); appendCellValue(setters, ignoreException, cw, classType); append_cellValue(delayedCellSetters, setters, cw, classType, maxMethodSize); appendApplyDelayedSetter(delayedCellSetters, ignoreException, cw, classType, maxMethodSize); appendApplyDelayedCellSetterN(delayedCellSetters, cw, classType); appendGetDelayedCellSetter(delayedCellSetters, cw, targetType, classType, maxMethodSize); appendPeekDelayedCellSetterValue(delayedCellSetters, cw, classType, maxMethodSize); cw.visitEnd(); return AsmUtils.writeClassToFile(className, cw.toByteArray()); }