summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2009-04-05 14:39:35 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2009-04-05 14:39:35 +0000
commit2d08b554a9a944f60d5471a6eca94dc32f42d1ba (patch)
treede55053480e89122f215c8a5bbd93b92994e6f80
parent7193a0e14e488ef07f723a0b9f490a03fe291650 (diff)
downloadpygobject-2d08b554a9a944f60d5471a6eca94dc32f42d1ba.tar.gz
pygobject-2d08b554a9a944f60d5471a6eca94dc32f42d1ba.tar.xz
pygobject-2d08b554a9a944f60d5471a6eca94dc32f42d1ba.zip
Bug 577999 – converting a negative long Python value to a GUINT64 GValue doesn't error out as it should
svn path=/trunk/; revision=1054
-rw-r--r--ChangeLog6
-rw-r--r--gobject/pygtype.c54
-rw-r--r--tests/test_properties.py3
3 files changed, 25 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 5a999c6..180539a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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):