summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-05-22 20:44:16 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-05-22 20:44:16 +0000
commit890a8138acb8e5bd17520633eb9b7add6729b9ab (patch)
tree7d1e7917c267403c9220ced1b8634619b0a52986
parent5a726d6531dd500670b0540d8ffeb8bfd8d98a54 (diff)
downloadpygobject-890a8138acb8e5bd17520633eb9b7add6729b9ab.tar.gz
Bug 165373: crash due to extra Py_XDECREF in gtk.TreeView.map_expanded_rows
-rw-r--r--gobject/pygobject.c40
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