summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--gobject/gobjectmodule.c4
-rw-r--r--gobject/pygparamspec.c24
-rw-r--r--tests/test_properties.py74
4 files changed, 98 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index c698f72..56def2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
+