diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 20:44:16 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 20:44:16 +0000 |
commit | 890a8138acb8e5bd17520633eb9b7add6729b9ab (patch) | |
tree | 7d1e7917c267403c9220ced1b8634619b0a52986 | |
parent | 5a726d6531dd500670b0540d8ffeb8bfd8d98a54 (diff) | |
download | pygobject-890a8138acb8e5bd17520633eb9b7add6729b9ab.tar.gz |
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 7379a927..1af303dd 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 |