private void visitObjectArrayPropertyAccessorWrite()

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 );
    }