From e9493a1872b122097e6bd7660398c267b966d2f6 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 4 Apr 2010 08:52:51 +0000 Subject: [PATCH] Merged revisions 79745 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r79745 | mark.dickinson | 2010-04-04 09:43:04 +0100 (Sun, 04 Apr 2010) | 3 lines Issue #8300 (__index__ handling in struct.pack): Remove redundant check and improve test coverage. Thanks Meador Inge for the patch. ........ --- Lib/test/test_struct.py | 41 +++++++++++++++++++++++++++++++---------- Modules/_struct.c | 7 +------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 2222562a5d..0c8cd2cea0 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -269,6 +269,25 @@ class StructTest(unittest.TestCase): def __int__(self): return 42 + # Objects with an '__index__' method should be allowed + # to pack as integers. That is assuming the implemented + # '__index__' method returns and 'int' or 'long'. + class Indexable(object): + def __init__(self, value): + self._value = value + + def __index__(self): + return self._value + + # If the '__index__' method raises a type error, then + # '__int__' should be used with a deprecation warning. + class BadIndex(object): + def __index__(self): + raise TypeError + + def __int__(self): + return 42 + self.assertRaises((TypeError, struct.error), struct.pack, self.format, "a string") @@ -280,17 +299,12 @@ class StructTest(unittest.TestCase): 3+42j) self.assertRaises((TypeError, struct.error), struct.pack, self.format, - NotAnInt) - - # Objects with an '__index__' method should be allowed - # to pack as integers. - class Indexable(object): - def __init__(self, value): - self._value = value - - def __index__(self): - return self._value + NotAnInt()) + self.assertRaises((TypeError, struct.error), + struct.pack, self.format, + BadIndex()) + # Check for legitimate values from '__index__'. for obj in (Indexable(0), Indexable(10), Indexable(17), Indexable(42), Indexable(100), Indexable(127)): try: @@ -299,6 +313,13 @@ class StructTest(unittest.TestCase): self.fail("integer code pack failed on object " "with '__index__' method") + # Check for bogus values from '__index__'. + for obj in (Indexable(b'a'), Indexable('b'), Indexable(None), + Indexable({'a': 1}), Indexable([1, 2, 3])): + self.assertRaises((TypeError, struct.error), + struct.pack, self.format, + obj) + for code in integer_codes: for byteorder in byteorders: if (byteorder in ('', '@') and code in ('q', 'Q') and diff --git a/Modules/_struct.c b/Modules/_struct.c index d000df2051..94bc3976db 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -102,12 +102,6 @@ get_pylong(PyObject *v) v = PyNumber_Index(v); if (v == NULL) return NULL; - if (!PyLong_Check(v)) { - PyErr_SetString(PyExc_TypeError, - "__index__ method " - "returned non-integer"); - return NULL; - } } else { PyErr_SetString(StructError, @@ -118,6 +112,7 @@ get_pylong(PyObject *v) else Py_INCREF(v); + assert(PyLong_Check(v)); return v; } -- 2.40.0