From f0ff018ae9f5fbb5223ec4fbc70092f185ff83d5 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 22 Jan 2005 19:50:00 +0000 Subject: [Bug 154372] New: - Calling an enumeration type causes an assertion failure --- gobject/pygenum.c | 14 +++++++++++--- gobject/pygflags.c | 22 +++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/gobject/pygenum.c b/gobject/pygenum.c index 5df360b..5c6bf89 100644 --- a/gobject/pygenum.c +++ b/gobject/pygenum.c @@ -89,7 +89,7 @@ pyg_enum_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) if (!pytc) return NULL; - if (!PyObject_TypeCheck(pytc, &PyGEnum_Type)) { + if (!PyObject_TypeCheck(pytc, &PyGTypeWrapper_Type)) { Py_DECREF(pytc); PyErr_SetString(PyExc_TypeError, "__gtype__ attribute not a typecode"); @@ -166,7 +166,7 @@ pyg_enum_add (PyObject * module, GType gtype) { PyGILState_STATE state; - PyObject *instance_dict, *stub, *values; + PyObject *instance_dict, *stub, *values, *o; GEnumClass *eclass; int i; @@ -186,6 +186,9 @@ pyg_enum_add (PyObject * module, return NULL; } + ((PyTypeObject *)stub)->tp_flags &= ~Py_TPFLAGS_BASETYPE; + ((PyTypeObject *)stub)->tp_new = pyg_enum_new; + if (module) PyDict_SetItemString(((PyTypeObject *)stub)->tp_dict, "__module__", @@ -196,6 +199,10 @@ pyg_enum_add (PyObject * module, g_type_set_qdata(gtype, pygenum_class_key, stub); + o = pyg_type_wrapper_new(gtype); + PyDict_SetItemString(((PyTypeObject *)stub)->tp_dict, "__gtype__", o); + Py_DECREF(o); + if (module) { /* Add it to the module name space */ PyModule_AddObject(module, (char*)typename, stub); @@ -270,6 +277,7 @@ pyg_enum_get_value_nick(PyGEnum *self, void *closure) return retval; } + static PyGetSetDef pyg_enum_getsets[] = { { "value_name", (getter)pyg_enum_get_value_name, (setter)0 }, { "value_nick", (getter)pyg_enum_get_value_nick, (setter)0 }, @@ -313,7 +321,7 @@ PyTypeObject PyGEnum_Type = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - 0, /* tp_init */ + 0, /* tp_init */ 0, /* tp_alloc */ pyg_enum_new, /* tp_new */ }; diff --git a/gobject/pygflags.c b/gobject/pygflags.c index 9e0fab3..92f9993 100644 --- a/gobject/pygflags.c +++ b/gobject/pygflags.c @@ -118,7 +118,7 @@ pyg_flags_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) if (!pytc) return NULL; - if (!PyObject_TypeCheck(pytc, &PyGFlags_Type)) { + if (!PyObject_TypeCheck(pytc, &PyGTypeWrapper_Type)) { Py_DECREF(pytc); PyErr_SetString(PyExc_TypeError, "__gtype__ attribute not a typecode"); @@ -130,12 +130,6 @@ pyg_flags_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) eclass = G_FLAGS_CLASS(g_type_class_ref(gtype)); - if (value < 0 || value > eclass->n_values) { - PyErr_SetString(PyExc_ValueError, "value out of range"); - g_type_class_unref(eclass); - return NULL; - } - values = PyObject_GetAttrString((PyObject *)type, "__flags_values__"); if (!values) { g_type_class_unref(eclass); @@ -152,8 +146,11 @@ pyg_flags_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) g_type_class_unref(eclass); ret = PyDict_GetItem(values, PyInt_FromLong(value)); - Py_INCREF(ret); Py_DECREF(values); + if (ret) + Py_INCREF(ret); + else + PyErr_SetString(PyExc_ValueError, "invalid flag value"); return ret; } @@ -196,7 +193,7 @@ pyg_flags_add (PyObject * module, GType gtype) { PyGILState_STATE state; - PyObject *instance_dict, *stub, *values; + PyObject *instance_dict, *stub, *values, *o; GFlagsClass *eclass; int i; @@ -217,6 +214,9 @@ pyg_flags_add (PyObject * module, return NULL; } + ((PyTypeObject *)stub)->tp_flags &= ~Py_TPFLAGS_BASETYPE; + ((PyTypeObject *)stub)->tp_new = pyg_flags_new; + PyDict_SetItemString(((PyTypeObject *)stub)->tp_dict, "__module__", PyString_FromString(PyModule_GetName(module))); @@ -229,6 +229,10 @@ pyg_flags_add (PyObject * module, pygflags_class_key = g_quark_from_static_string(pygflags_class_id); g_type_set_qdata(gtype, pygflags_class_key, stub); + + o = pyg_type_wrapper_new(gtype); + PyDict_SetItemString(((PyTypeObject *)stub)->tp_dict, "__gtype__", o); + Py_DECREF(o); /* Register flag values */ eclass = G_FLAGS_CLASS(g_type_class_ref(gtype)); -- cgit