summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-05-22 20:51:46 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-05-22 20:51:46 +0000
commit9e09ae4589a689921fc57b046092615d14c70ff8 (patch)
treebfd287a0a13bf1eeca35f750fc9c05bab61e34ee
parent2abe91752472e501266330b7ca21976046e1973e (diff)
downloadpygobject-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.c40
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