`OUT` / `INOUT` arguments in vfuncs not typed as pointers
BlobCodes opened this issue · 0 comments
BlobCodes commented
Example definition of Gtk::Widget._register_unsafe_do_measure
private macro _register_unsafe_do_measure
private def self._vfunc_unsafe_measure(%this : Pointer(Void), lib_orientation : UInt32, lib_for_size : Int32, lib_minimum : Int32, lib_natural : Int32, lib_minimum_baseline : Int32, lib_natural_baseline : Int32, ) : Void
# @orientation:
# @for_size:
# @minimum: (out) (transfer full) (optional)
# @natural: (out) (transfer full) (optional)
# @minimum_baseline: (out) (transfer full) (optional)
# @natural_baseline: (out) (transfer full) (optional)
%gc_collected = !LibGObject.g_object_get_qdata(%this, GICrystal::GC_COLLECTED_QDATA_KEY).null?
%instance = LibGObject.g_object_get_qdata(%this, GICrystal::INSTANCE_QDATA_KEY)
raise GICrystal::ObjectCollectedError.new if %gc_collected || %instance.null?
%instance.as(self).unsafe_do_measure(lib_orientation, lib_for_size, lib_minimum, lib_natural, lib_minimum_baseline, lib_natural_baseline)
end
def self._class_init(type_struct : Pointer(LibGObject::TypeClass), user_data : Pointer(Void)) : Nil
vfunc_ptr = (type_struct.as(Pointer(Void)) + 232).as(Pointer(Pointer(Void)))
vfunc_ptr.value = (->_vfunc_unsafe_measure(Pointer(Void), UInt32, Int32, Int32, Int32, Int32, Int32)).pointer
previous_def
end
end
The last four arguments have to be pointers because their ArgInfo#direction
are OUT
. This is currently not accounted for.