static void
in_argument_from_ruby(RBGIArgMetadata *metadata, VALUE rb_arguments,
                      GArray *in_args, GPtrArray *args_metadata,
                      VALUE self)
{
    if (metadata->callback_p && !metadata->destroy_p) {
        in_callback_argument_from_ruby(metadata, in_args);
        return;
    }

    if (metadata->rb_arg_index == -1) {
        return;
    }

    if (metadata->array_p) {
        GIArgument *array_argument;
        GIArgument *length_argument = NULL;
        GIArgInfo *length_arg_info = NULL;
        VALUE rb_argument = Qnil;

        if (RARRAY_LEN(rb_arguments) > metadata->rb_arg_index) {
            rb_argument = RARRAY_PTR(rb_arguments)[metadata->rb_arg_index];
        }
        array_argument = &(g_array_index(in_args,
                                         GIArgument,
                                         metadata->in_arg_index));
        if (metadata->array_length_in_arg_index != -1) {
            RBGIArgMetadata *length_metadata;
            length_argument =
                &(g_array_index(in_args,
                                GIArgument,
                                metadata->array_length_in_arg_index));
            length_metadata =
                g_ptr_array_index(args_metadata,
                                  metadata->array_length_arg_index);
            length_arg_info = &(length_metadata->arg_info);
        }
        RVAL2GI_IN_ARRAY_ARGUMENT(array_argument,
                                  length_argument,
                                  &(metadata->arg_info),
                                  length_arg_info,
                                  rb_argument);
    } else {
        GIArgument *argument;
        VALUE rb_argument = Qnil;

        if (RARRAY_LEN(rb_arguments) > metadata->rb_arg_index) {
            rb_argument = RARRAY_PTR(rb_arguments)[metadata->rb_arg_index];
        }
        argument = &(g_array_index(in_args, GIArgument, metadata->in_arg_index));
        RVAL2GI_IN_ARGUMENT(argument,
                            &(metadata->arg_info),
                            rb_argument,
                            self);
    }
}
static void
in_argument_from_ruby(RBGIArgMetadata *metadata, VALUE rb_arguments,
                      GArray *in_args)
{
    if (metadata->rb_arg_index == -1) {
        return;
    }

    if (metadata->callback_p) {
        in_callback_argument_from_ruby(metadata, in_args);
    } else {
        GIArgument *argument;
        VALUE rb_argument = Qnil;

        if (RARRAY_LEN(rb_arguments) > metadata->rb_arg_index) {
            rb_argument = RARRAY_PTR(rb_arguments)[metadata->rb_arg_index];
        }
        argument = &(g_array_index(in_args, GIArgument, metadata->in_arg_index));
        RVAL2GI_IN_ARGUMENT(argument,
                            &(metadata->arg_info),
                            rb_argument);
    }
}