diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gobject/pygtype.c | 54 | ||||
-rw-r--r-- | tests/test_properties.py | 3 |
3 files changed, 25 insertions, 38 deletions
@@ -1,3 +1,9 @@ +2009-04-05 Gustavo J. A. M. Carneiro <gjc@gnome.org> + + * gobject/pygtype.c (pyg_value_from_pyobject): Bug 577999 – + converting a negative long Python value to a GUINT64 GValue + doesn't error out as it should. + 2009-04-04 Gian Mario Tagliaretti <gianmt@gnome.org> * gio/gfile.override: diff --git a/gobject/pygtype.c b/gobject/pygtype.c index 8f9b233..a9b18a4 100644 --- a/gobject/pygtype.c +++ b/gobject/pygtype.c @@ -716,11 +716,6 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) break; case G_TYPE_INT: g_value_set_int(value, _PyLong_AsLong(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } break; case G_TYPE_UINT: { @@ -734,21 +729,11 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) return -1; } else { g_value_set_uint(value, PyLong_AsUnsignedLong(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } } } break; case G_TYPE_LONG: g_value_set_long(value, _PyLong_AsLong(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } break; case G_TYPE_ULONG: { @@ -762,26 +747,24 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) return -1; } else { g_value_set_ulong(value, PyLong_AsUnsignedLong(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } } } break; case G_TYPE_INT64: g_value_set_int64(value, PyLong_AsLongLong(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } break; case G_TYPE_UINT64: - if (_PyLong_Check(obj)) - g_value_set_uint64(value, _PyLong_AsLong(obj)); - else if (PyLong_Check(obj)) +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v < 0) { + PyErr_SetString(PyExc_OverflowError, "negative value not allowed for uint64 property"); + return -1; + } + g_value_set_uint64(value, v); + } else +#endif + if (PyLong_Check(obj)) g_value_set_uint64(value, PyLong_AsUnsignedLongLong(obj)); else return -1; @@ -808,19 +791,9 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) break; case G_TYPE_FLOAT: g_value_set_float(value, PyFloat_AsDouble(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } break; case G_TYPE_DOUBLE: g_value_set_double(value, PyFloat_AsDouble(obj)); - if (PyErr_Occurred()) { - g_value_unset(value); - PyErr_Clear(); - return -1; - } break; case G_TYPE_STRING: if (obj == Py_None) @@ -915,6 +888,11 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) break; } } + if (PyErr_Occurred()) { + g_value_unset(value); + PyErr_Clear(); + return -1; + } return 0; } diff --git a/tests/test_properties.py b/tests/test_properties.py index a691b32..e3be865 100644 --- a/tests/test_properties.py +++ b/tests/test_properties.py @@ -85,6 +85,9 @@ class TestProperties(unittest.TestCase): obj.props.uint64 = 1 self.assertEqual(obj.props.uint64, 1L) + self.assertRaises((TypeError, OverflowError), obj.set_property, "uint64", -1L) + self.assertRaises((TypeError, OverflowError), obj.set_property, "uint64", -1) + def testUInt64DefaultValue(self): try: class TimeControl(GObject): |