diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-06-20 22:57:41 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-06-20 22:57:41 +0000 |
commit | 805b507053ce9223c589368325aa54037135c418 (patch) | |
tree | 1f5b701f1ae39d00f9f1a5a0545d69b323bda6fb | |
parent | a275a63895717170c3a8fe1ea66e2420fd5ab641 (diff) | |
download | pygobject-805b507053ce9223c589368325aa54037135c418.tar.gz |
Bug 308097: Overriden realize gets called twice
-rw-r--r-- | gobject/gobjectmodule.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index d87cb854..061e591c 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -500,17 +500,19 @@ override_signal(GType instance_type, const gchar *signal_name) return TRUE; } -static gboolean +static PyObject * add_signals (GType instance_type, PyObject *signals) { gboolean ret = TRUE; GObjectClass *oclass; int pos = 0; - PyObject *key, *value; + PyObject *key, *value, *overridden_signals = NULL; + overridden_signals = PyDict_New(); oclass = g_type_class_ref(instance_type); while (PyDict_Next(signals, &pos, &key, &value)) { const gchar *signal_name; + gchar *signal_name_canon, *c; if (!PyString_Check(key)) { PyErr_SetString(PyExc_TypeError, @@ -522,7 +524,20 @@ add_signals (GType instance_type, PyObject *signals) if (value == Py_None || (PyString_Check(value) && - !strcmp(PyString_AsString(value), "override"))) { + !strcmp(PyString_AsString(value), "override"))) + { + /* canonicalize signal name, replacing '-' with '_' */ + signal_name_canon = g_strdup(signal_name); + for (c = signal_name_canon; *c; ++c) + if (*c == '-') + *c = '_'; + if (PyDict_SetItemString(overridden_signals, signal_name_canon, key)) { + g_free(signal_name_canon); + ret = FALSE; + break; + } + g_free(signal_name_canon); + ret = override_signal(instance_type, signal_name); } else { ret = create_signal(instance_type, signal_name, value); @@ -532,7 +547,12 @@ add_signals (GType instance_type, PyObject *signals) break; } g_type_class_unref(oclass); - return ret; + if (ret) + return overridden_signals; + else { + Py_XDECREF(overridden_signals); + return NULL; + } } static GParamSpec * @@ -939,7 +959,7 @@ _wrap_pyg_type_register(PyObject *self, PyObject *args) int pyg_type_register(PyTypeObject *class) { - PyObject *gtype, *module, *gsignals, *gproperties; + PyObject *gtype, *module, *gsignals, *gproperties, *overridden_signals; GType parent_type, instance_type; gchar *type_name = NULL; gint i, name_serial; @@ -1041,11 +1061,12 @@ pyg_type_register(PyTypeObject *class) "__gsignals__ attribute not a dict!"); return -1; } - if (!add_signals(instance_type, gsignals)) { + if (!(overridden_signals = add_signals(instance_type, gsignals))) { return -1; } - PyDict_DelItemString(class->tp_dict, "__gsignals__"); - /* Borrowed reference. Py_DECREF(gsignals); */ + if (PyDict_SetItemString(class->tp_dict, "__gsignals__", overridden_signals)) + return -1; + Py_DECREF(overridden_signals); } else { PyErr_Clear(); } @@ -1075,6 +1096,9 @@ pyg_type_register(PyTypeObject *class) } g_type_class_unref(gclass); + if (gsignals) + PyDict_DelItemString(class->tp_dict, "__gsignals__"); + /* Register interface implementations */ if (class->tp_bases) { for (i = 0; i < PyTuple_GET_SIZE(class->tp_bases); ++i) |