diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 20:51:46 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 20:51:46 +0000 |
commit | 9e09ae4589a689921fc57b046092615d14c70ff8 (patch) | |
tree | bfd287a0a13bf1eeca35f750fc9c05bab61e34ee | |
parent | 2abe91752472e501266330b7ca21976046e1973e (diff) | |
download | pygobject-9e09ae4589a689921fc57b046092615d14c70ff8.tar.gz pygobject-9e09ae4589a689921fc57b046092615d14c70ff8.tar.xz pygobject-9e09ae4589a689921fc57b046092615d14c70ff8.zip |
Bug 165373: crash due to extra Py_XDECREF in gtk.TreeView.map_expanded_rows
-rw-r--r-- | gobject/pygobject.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/gobject/pygobject.c b/gobject/pygobject.c index 7379a92..1af303d 100644 --- a/gobject/pygobject.c +++ b/gobject/pygobject.c @@ -484,11 +484,44 @@ pygobject_repr(PyGObject *self) return PyString_FromString(buf); } +typedef struct { + visitproc visit; + void *arg; + int retval; +} gobject_visit_data_t; + +static void +_pygobject_visit_func(GObject *object, + gpointer _data) +{ + gobject_visit_data_t *data = _data; + PyObject *wrapper; + + if (data->retval) + return; + + /* FIXME: this should be moved into module initialization */ + if (!pygobject_wrapper_key) + pygobject_wrapper_key = g_quark_from_static_string(pygobject_wrapper_id); + + wrapper = (PyObject *) g_object_get_qdata(object, pygobject_wrapper_key); + if (wrapper) { + data->retval = data->visit(wrapper, data->arg); + if (data->retval) + return; + } else { + /* recursively visit children */ + g_object_traverse(object, _pygobject_visit_func, data); + } +} + + static int pygobject_traverse(PyGObject *self, visitproc visit, void *arg) { int ret = 0; GSList *tmp; + gobject_visit_data_t gobjvisitdata; if (self->inst_dict) ret = visit(self->inst_dict, arg); if (ret != 0) return ret; @@ -510,7 +543,12 @@ pygobject_traverse(PyGObject *self, visitproc visit, void *arg) ret = visit((PyObject *)self, arg); if (ret != 0) return ret; - return 0; + gobjvisitdata.visit = visit; + gobjvisitdata.arg = arg; + gobjvisitdata.retval = 0; + g_object_traverse(self->obj, _pygobject_visit_func, &gobjvisitdata); + + return gobjvisitdata.retval; } static int |