diff options
| -rw-r--r-- | ChangeLog | 11 | ||||
| -rw-r--r-- | gobject/gobjectmodule.c | 4 | ||||
| -rw-r--r-- | gobject/pygparamspec.c | 24 | ||||
| -rw-r--r-- | tests/test_properties.py | 74 |
4 files changed, 98 insertions, 15 deletions
@@ -1,3 +1,14 @@ +2006-11-18 Yevgen Muntyan <muntyan@tamu.edu> + + reviewed by: Johan Dahlin <johan@gnome.org> + + * gobject/gobjectmodule.c: (create_property): + * gobject/pygparamspec.c: (pyg_param_spec_getattr): + * tests/test_properties.py: + + Avoid truncating in pyg_param_spec_getattr, add test for all non-float + numeric types. Fixes #353943 + 2006-11-18 Johan Dahlin <jdahlin@async.com.br> * gobject/pygtype.c (gclosure_from_pyfunc): Use PyObject_Cmp instead diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index df3f8b7..d71a9e4 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -740,7 +740,7 @@ create_property (const gchar *prop_name, { guint minimum, maximum, default_value; - if (!PyArg_ParseTuple(args, "iii", &minimum, &maximum, + if (!PyArg_ParseTuple(args, "III", &minimum, &maximum, &default_value)) return NULL; pspec = g_param_spec_uint (prop_name, nick, blurb, minimum, @@ -762,7 +762,7 @@ create_property (const gchar *prop_name, { gulong minimum, maximum, default_value; - if (!PyArg_ParseTuple(args, "lll", &minimum, &maximum, + if (!PyArg_ParseTuple(args, "kkk", &minimum, &maximum, &default_value)) return NULL; pspec = g_param_spec_ulong (prop_name, nick, blurb, minimum, diff --git a/gobject/pygparamspec.c b/gobject/pygparamspec.c index b8bd3ee..2c0e001 100644 --- a/gobject/pygparamspec.c +++ b/gobject/pygparamspec.c @@ -182,11 +182,11 @@ pyg_param_spec_getattr(PyGParamSpec *self, const gchar *attr) "name", "nick", "owner_type", "value_type"); } else if (!strcmp(attr, "default_value")) { - return PyInt_FromLong(G_PARAM_SPEC_UINT(pspec)->default_value); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_UINT(pspec)->default_value); } else if (!strcmp(attr, "minimum")) { - return PyInt_FromLong(G_PARAM_SPEC_UINT(pspec)->minimum); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_UINT(pspec)->minimum); } else if (!strcmp(attr, "maximum")) { - return PyInt_FromLong(G_PARAM_SPEC_UINT(pspec)->maximum); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_UINT(pspec)->maximum); } } else if (G_IS_PARAM_SPEC_LONG(pspec)) { if (!strcmp(attr, "__members__")) { @@ -208,11 +208,11 @@ pyg_param_spec_getattr(PyGParamSpec *self, const gchar *attr) "flags", "maximum", "minimum", "name", "nick", "owner_type", "value_type"); } else if (!strcmp(attr, "default_value")) { - return PyLong_FromLong(G_PARAM_SPEC_ULONG(pspec)->default_value); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_ULONG(pspec)->default_value); } else if (!strcmp(attr, "minimum")) { - return PyLong_FromLong(G_PARAM_SPEC_ULONG(pspec)->minimum); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_ULONG(pspec)->minimum); } else if (!strcmp(attr, "maximum")) { - return PyLong_FromLong(G_PARAM_SPEC_ULONG(pspec)->maximum); + return PyLong_FromUnsignedLong(G_PARAM_SPEC_ULONG(pspec)->maximum); } } else if (G_IS_PARAM_SPEC_INT64(pspec)) { if (!strcmp(attr, "__members__")) { @@ -221,11 +221,11 @@ pyg_param_spec_getattr(PyGParamSpec *self, const gchar *attr) "flags", "maximum", "minimum", "name", "nick", "owner_type", "value_type"); } else if (!strcmp(attr, "default_value")) { - return PyLong_FromLong(G_PARAM_SPEC_INT64(pspec)->default_value); + return PyLong_FromLongLong(G_PARAM_SPEC_INT64(pspec)->default_value); } else if (!strcmp(attr, "minimum")) { - return PyLong_FromLong(G_PARAM_SPEC_INT64(pspec)->minimum); + return PyLong_FromLongLong(G_PARAM_SPEC_INT64(pspec)->minimum); } else if (!strcmp(attr, "maximum")) { - return PyLong_FromLong(G_PARAM_SPEC_INT64(pspec)->maximum); + return PyLong_FromLongLong(G_PARAM_SPEC_INT64(pspec)->maximum); } } else if (G_IS_PARAM_SPEC_UINT64(pspec)) { if (!strcmp(attr, "__members__")) { @@ -235,11 +235,11 @@ pyg_param_spec_getattr(PyGParamSpec *self, const gchar *attr) "name", "nick", "owner_type", "value_type"); } else if (!strcmp(attr, "default_value")) { - return PyLong_FromLong(G_PARAM_SPEC_UINT64(pspec)->default_value); + return PyLong_FromUnsignedLongLong(G_PARAM_SPEC_UINT64(pspec)->default_value); } else if (!strcmp(attr, "minimum")) { - return PyLong_FromLong(G_PARAM_SPEC_UINT64(pspec)->minimum); + return PyLong_FromUnsignedLongLong(G_PARAM_SPEC_UINT64(pspec)->minimum); } else if (!strcmp(attr, "maximum")) { - return PyLong_FromLong(G_PARAM_SPEC_UINT64(pspec)->maximum); + return PyLong_FromUnsignedLongLong(G_PARAM_SPEC_UINT64(pspec)->maximum); } } else if (G_IS_PARAM_SPEC_UNICHAR(pspec)) { if (!strcmp(attr, "__members__")) { diff --git a/tests/test_properties.py b/tests/test_properties.py index d75a810..5a819fa 100644 --- a/tests/test_properties.py +++ b/tests/test_properties.py @@ -1,9 +1,12 @@ +import struct import unittest from common import testhelper from gobject import GObject, GType, new, PARAM_READWRITE, \ - PARAM_CONSTRUCT, PARAM_READABLE, PARAM_CONSTRUCT_ONLY, TYPE_UINT64 + PARAM_CONSTRUCT, PARAM_READABLE, PARAM_WRITABLE, PARAM_CONSTRUCT_ONLY, \ + TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG, \ + TYPE_INT64, TYPE_UINT64 class PropertyObject(GObject): __gproperties__ = { @@ -120,3 +123,72 @@ class TestProperties(unittest.TestCase): } except OverflowError, ex: self.fail(str(ex)) + + def testRange(self): + # kiwi code + def max(c): + return 2 ** ((8 * struct.calcsize(c)) - 1) - 1 + def umax(c): + return 2 ** (8 * struct.calcsize(c)) - 1 + + maxint = max('i') + minint = -maxint - 1 + maxuint = umax('I') + maxlong = max('l') + minlong = -maxlong - 1 + maxulong = umax('L') + maxint64 = max('q') + minint64 = -maxint64 - 1 + maxuint64 = umax('Q') + + types = dict(int=(TYPE_INT, minint, maxint), + uint=(TYPE_UINT, 0, maxuint), + long=(TYPE_LONG, minlong, maxlong), + ulong=(TYPE_ULONG, 0, maxulong), + int64=(TYPE_INT64, minint64, maxint64), + uint64=(TYPE_UINT64, 0, maxuint64)) + + def build_gproperties(types): + d = {} + for key, (gtype, min, max) in types.items(): + d[key] = (gtype, 'blurb', 'desc', min, max, 0, + PARAM_READABLE | PARAM_WRITABLE) + return d + + class RangeCheck(GObject): + __gproperties__ = build_gproperties(types) + + def __init__(self): + self.values = {} + GObject.__init__(self) + + def do_set_property(self, pspec, value): + self.values[pspec.name] = value + + def do_get_property(self, pspec): + return self.values.get(pspec.name, pspec.default_value) + + self.assertEqual(RangeCheck.props.int.minimum, minint) + self.assertEqual(RangeCheck.props.int.maximum, maxint) + self.assertEqual(RangeCheck.props.uint.minimum, 0) + self.assertEqual(RangeCheck.props.uint.maximum, maxuint) + self.assertEqual(RangeCheck.props.long.minimum, minlong) + self.assertEqual(RangeCheck.props.long.maximum, maxlong) + self.assertEqual(RangeCheck.props.ulong.minimum, 0) + self.assertEqual(RangeCheck.props.ulong.maximum, maxulong) + self.assertEqual(RangeCheck.props.int64.minimum, minint64) + self.assertEqual(RangeCheck.props.int64.maximum, maxint64) + self.assertEqual(RangeCheck.props.uint64.minimum, 0) + self.assertEqual(RangeCheck.props.uint64.maximum, maxuint64) + + obj = RangeCheck() + for key, (gtype, min, max) in types.items(): + self.assertEqual(obj.get_property(key), + getattr(RangeCheck.props, key).default_value) + + obj.set_property(key, min) + self.assertEqual(obj.get_property(key), min) + + obj.set_property(key, max) + self.assertEqual(obj.get_property(key), max) + |
