summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-01-22 19:50:00 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-01-22 19:50:00 +0000
commitf0ff018ae9f5fbb5223ec4fbc70092f185ff83d5 (patch)
treee28c04ccc5cb11ba5cc6649803a4615448571b32
parent25b5666ce1385c98063cec56a102cb58e674322d (diff)
downloadpygobject-PYGTK_2_5_3.tar.gz
pygobject-PYGTK_2_5_3.tar.xz
pygobject-PYGTK_2_5_3.zip
[Bug 154372] New: - Calling an enumeration type causes an assertion failurePYGTK_2_5_3
-rw-r--r--gobject/pygenum.c14
-rw-r--r--gobject/pygflags.c22
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));