Value marshaller assumes types encoded via GI_INFO_TYPE_OBJECT derive from GObject or GParamSpec
Calling functions returning instances of non-GObject classed GTypes end up failing an assert in g_object_get_qdata
, called by pygobject_new_full
(pygobject-object.c:1007). The Python object never gets properly instantiated and the interpreter eventually crashes. It looks like an extra bit is needed in pygi_arg_gobject_to_py
(pygi-object.c:227).
A couple of reproducers:
Cogl
from gi.repository import Cogl # works for both v1.0 and v2.0
Cogl.Bitmap.new_from_file('/path/to/some/image.jpg')
Snippet from Cogl-1.0.gir:
<class name="Bitmap"
c:symbol-prefix="bitmap"
c:type="CoglBitmap"
glib:type-name="CoglBitmap"
glib:get-type="cogl_bitmap_get_gtype"
glib:fundamental="1">
<constructor name="new_from_file"
c:identifier="cogl_bitmap_new_from_file"
version="1.0"
throws="1">
<return-value transfer-ownership="full">
<type name="Bitmap" c:type="CoglBitmap*"/>
</return-value>
<parameters>
<parameter name="filename" transfer-ownership="none">
<type name="utf8" c:type="const char*"/>
</parameter>
</parameters>
</constructor>
Interactive output:
>>> import gi
>>> gi.require_version('Cogl', '1.0')
>>> from gi.repository import Cogl
>>> b = Cogl.Bitmap.new_from_file('/tmp/test.jpg')
__main__:1: Warning: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed
__main__:1: Warning: g_object_is_floating: assertion 'G_IS_OBJECT (object)' failed
** (process:xxxxx): CRITICAL **: xx:xx:xx.xxx: pygobject_register_wrapper: assertion 'PyObject_TypeCheck(self, &PyGObject_Type)' failed
>>> b.__dict__
[1] xxxxx segmentation fault (core dumped) python3
Clutter
from gi.repository import Clutter
Clutter.init()
Clutter.ClipNode.new()
Snippet from Clutter-1.0.gir:
<class name="PaintNode"
c:symbol-prefix="paint_node"
c:type="ClutterPaintNode"
version="1.10"
abstract="1"
glib:type-name="ClutterPaintNode"
glib:get-type="clutter_paint_node_get_type"
glib:type-struct="PaintNodeClass"
glib:fundamental="1"
glib:ref-func="clutter_paint_node_ref"
glib:unref-func="clutter_paint_node_unref"
glib:set-value-func="clutter_value_set_paint_node"
glib:get-value-func="clutter_value_get_paint_node">
...
<class name="ClipNode"
c:symbol-prefix="clip_node"
c:type="ClutterClipNode"
version="1.10"
parent="PaintNode"
glib:type-name="ClutterClipNode"
glib:get-type="clutter_clip_node_get_type"
glib:type-struct="ClipNodeClass"
glib:fundamental="1">
<constructor name="new"
c:identifier="clutter_clip_node_new"
version="1.10">
<return-value transfer-ownership="full">
<type name="PaintNode" c:type="ClutterPaintNode*"/>
</return-value>
</constructor>
Interactive output:
>>> from gi.repository import Clutter
__main__:1: PyGIWarning: Clutter was imported without specifying a version first. Use gi.require_version('Clutter', '1.0') before import to ensure that the right version gets loaded.
>>> Clutter.init()
(<enum CLUTTER_INIT_SUCCESS of type Clutter.InitError>, argv=[])
>>> n = Clutter.ClipNode.new()
__main__:1: Warning: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed
__main__:1: Warning: g_object_is_floating: assertion 'G_IS_OBJECT (object)' failed
** (python3:xxxxx): CRITICAL **: xx:xx:xx.xxx: pygobject_register_wrapper: assertion 'PyObject_TypeCheck(self, &PyGObject_Type)' failed
>>> n
[1] xxxxx segmentation fault (core dumped) python3