in lightning-core/src/main/java/org/apache/directmemory/lightning/internal/generator/BytecodeMarshallerGenerator.java [597:668]
private void visitObjectArrayPropertyAccessorWrite( MethodVisitor mv, String className,
PropertyDescriptor propertyDescriptor )
{
Class<?> propertyType = propertyDescriptor.getType();
Class<?> componentType = propertyType.getComponentType();
// Read size
mv.visitVarInsn( ALOAD, 3 );
mv.visitMethodInsn( INVOKEINTERFACE, SOURCE_CLASS_INTERNAL_TYPE, "readInt", "()I" );
mv.visitInsn( DUP );
mv.visitVarInsn( ISTORE, 5 );
// Instantiate array
mv.visitTypeInsn( ANEWARRAY, Type.getType( componentType ).getInternalName() );
mv.visitVarInsn( ASTORE, 6 );
// Read PropertyAccessor from field
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, className, toFinalFieldName( "accessor", propertyDescriptor ),
PROPERTYACCESSOR_CLASS_DESCRIPTOR );
mv.visitVarInsn( ASTORE, 9 );
// Get component type
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, className, toFinalFieldName( "component", propertyDescriptor ),
CHEATINGPROPERTYDESCRIPTOR_CLASS_DESCRIPTOR );
mv.visitVarInsn( ASTORE, 8 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, className, toFinalFieldName( "marshaller", propertyDescriptor ),
MARSHALLER_CLASS_DESCRIPTOR );
mv.visitVarInsn( ASTORE, 10 );
// For loop
Label forLoopStart = new Label();
Label forLoopEnd = new Label();
mv.visitInsn( ICONST_0 );
mv.visitVarInsn( ISTORE, 7 );
mv.visitJumpInsn( GOTO, forLoopEnd );
mv.visitLabel( forLoopStart );
// Write value to array
mv.visitVarInsn( ALOAD, 9 );
mv.visitVarInsn( ALOAD, 6 );
mv.visitVarInsn( ILOAD, 7 );
// Read value from stream to 4th stack position
mv.visitVarInsn( ALOAD, 10 );
mv.visitVarInsn( ALOAD, 8 );
mv.visitVarInsn( ALOAD, 3 );
mv.visitVarInsn( ALOAD, 4 );
mv.visitMethodInsn( INVOKEINTERFACE, MARSHALLER_CLASS_INTERNAL_TYPE, "unmarshall",
MARSHALLER_BASE_UNMARSHALL_SIGNATURE );
mv.visitMethodInsn( INVOKEINTERFACE, ARRAYPROPERTYACCESSOR_CLASS_INTERNAL_TYPE, "writeObject",
PROPERTY_ACCESSOR_ARRAY_WRITE_OBJECT_SIGNATURE );
// Increment counter
mv.visitIincInsn( 7, 1 );
// Test for loop end
mv.visitLabel( forLoopEnd );
mv.visitVarInsn( ILOAD, 7 );
mv.visitVarInsn( ILOAD, 5 );
mv.visitJumpInsn( IF_ICMPLT, forLoopStart );
// Write array to object
mv.visitVarInsn( ALOAD, 9 );
mv.visitVarInsn( ALOAD, 1 );
mv.visitVarInsn( ALOAD, 6 );
visitPropertyAccessorValueWrite( propertyType.getComponentType(), mv );
}