On 29/01/13 11:44, Simon Feltman wrote: > It seems like the problem at hand can be solved by maintaining the > floating ref and adding our own safety ref for the wrapper.
My impression was that floating references were purely for C convenience, and that interpreted languages with their own refcounting should be turning them into normal refs that can be reasoned about more easily. Shouldn't PyGObject rather be sinking *every* floating ref it sees? (Effectively, the Python wrapper would behave like a container, I suppose.) Then you'd have: (transfer none) function returning a pointer to a non-floating object: g_object_ref_sink() refs it; the wrapper now owns a normal ref. If you gtk_container_add() the wrapped object, the ref is no longer floating, so the container takes a new ref and the wrapper still owns the old ref. If the Python wrapper is destroyed, the C container still keeps the wrapped object alive. Good? (transfer none) function returning a pointer to a floating object: g_object_ref_sink() turns the floating ref into a normal ref. Proceed as above. Good? (transfer full) function returning a normal ref (as detected by g_object_is_floating() == FALSE): do nothing, the wrapper takes ownership of that ref. Proceed as above. Good? (transfer full) function returning a floating ref (as detected by g_object_is_floating() == TRUE): g_object_ref_sink() refs it, the wrapper now owns a normal ref. Proceed as above. Good? Pseudocode: def give_me_a_real_ref(function): if function.transfer_none: return g_object_ref_sink(function()) else: tmp = function() if g_object_is_floating(tmp): g_object_ref_sink(tmp) return tmp Or is that wrong? Regards, S _______________________________________________ gtk-devel-list mailing list gtk-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-devel-list