summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2008-01-24 13:08:54 (GMT)
committerThomas Heller <theller@ctypes.org>2008-01-24 13:08:54 (GMT)
commitfe528ebf6829b9be7cce38c7b15a3815a361faa2 (patch)
tree7198a0f1be145169f057e5186973ae935e85ba47
parente105f980460131d192d955fca0df474bcf1c642c (diff)
downloadcpython-fe528ebf6829b9be7cce38c7b15a3815a361faa2.zip
cpython-fe528ebf6829b9be7cce38c7b15a3815a361faa2.tar.gz
cpython-fe528ebf6829b9be7cce38c7b15a3815a361faa2.tar.bz2
Invert the checks in get_[u]long and get_[u]longlong. The intent was
to not accept float types; the result was that integer-like objects were not accepted.
-rw-r--r--Lib/ctypes/test/test_numbers.py18
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/cfield.c34
3 files changed, 35 insertions, 20 deletions
diff --git a/Lib/ctypes/test/test_numbers.py b/Lib/ctypes/test/test_numbers.py
index c22688d..c098be1 100644
--- a/Lib/ctypes/test/test_numbers.py
+++ b/Lib/ctypes/test/test_numbers.py
@@ -90,15 +90,31 @@ class NumberTestCase(unittest.TestCase):
def test_floats(self):
# c_float and c_double can be created from
# Python int, long and float
+ class FloatLike(object):
+ def __float__(self):
+ return 2.0
+ f = FloatLike()
for t in float_types:
self.failUnlessEqual(t(2.0).value, 2.0)
self.failUnlessEqual(t(2).value, 2.0)
self.failUnlessEqual(t(2L).value, 2.0)
+ self.failUnlessEqual(t(f).value, 2.0)
def test_integers(self):
- # integers cannot be constructed from floats
+ class FloatLike(object):
+ def __float__(self):
+ return 2.0
+ f = FloatLike()
+ class IntLike(object):
+ def __int__(self):
+ return 2
+ i = IntLike()
+ # integers cannot be constructed from floats,
+ # but from integer-like objects
for t in signed_types + unsigned_types:
self.assertRaises(TypeError, t, 3.14)
+ self.assertRaises(TypeError, t, f)
+ self.failUnlessEqual(t(i).value, 2)
def test_sizes(self):
for t in signed_types + unsigned_types + float_types:
diff --git a/Misc/NEWS b/Misc/NEWS
index eb23c09..46d3f66 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -67,6 +67,9 @@ Core and builtins
Library
-------
+- The ctypes int types did not accept objects implementing
+ __int__() in the constructor.
+
- #1189216: Fix the zipfile module to work on archives with headers
past the 2**31 byte boundary.
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 0fd82bc..d310ac5 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -355,10 +355,9 @@ static int
get_long(PyObject *v, long *p)
{
long x;
- if (!PyInt_Check(v) && !PyLong_Check(v)) {
- PyErr_Format(PyExc_TypeError,
- "int expected instead of %s instance",
- v->ob_type->tp_name);
+ if (PyFloat_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "int expected instead of float");
return -1;
}
x = PyInt_AsUnsignedLongMask(v);
@@ -374,10 +373,9 @@ static int
get_ulong(PyObject *v, unsigned long *p)
{
unsigned long x;
- if (!PyInt_Check(v) && !PyLong_Check(v)) {
- PyErr_Format(PyExc_TypeError,
- "int expected instead of %s instance",
- v->ob_type->tp_name);
+ if (PyFloat_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "int expected instead of float");
return -1;
}
x = PyInt_AsUnsignedLongMask(v);
@@ -395,11 +393,10 @@ static int
get_longlong(PyObject *v, PY_LONG_LONG *p)
{
PY_LONG_LONG x;
- if (!PyInt_Check(v) && !PyLong_Check(v)) {
- PyErr_Format(PyExc_TypeError,
- "int expected instead of %s instance",
- v->ob_type->tp_name);
- return -1;
+ if (PyFloat_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "int expected instead of float");
+ return -1;
}
x = PyInt_AsUnsignedLongLongMask(v);
if (x == -1 && PyErr_Occurred())
@@ -414,12 +411,11 @@ static int
get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
{
unsigned PY_LONG_LONG x;
- if (!PyInt_Check(v) && !PyLong_Check(v)) {
- PyErr_Format(PyExc_TypeError,
- "int expected instead of %s instance",
- v->ob_type->tp_name);
- return -1;
- }
+ if (PyFloat_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "int expected instead of float");
+ return -1;
+ }
x = PyInt_AsUnsignedLongLongMask(v);
if (x == -1 && PyErr_Occurred())
return -1;