]> granicus.if.org Git - python/commitdiff
Merged revisions 79745 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Sun, 4 Apr 2010 08:52:51 +0000 (08:52 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 4 Apr 2010 08:52:51 +0000 (08:52 +0000)
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
Modules/_struct.c

index 2222562a5d38ec3053fe2f632f133a9839ba1480..0c8cd2cea02b4c6dfec0643a5d2b14da40e3c01d 100644 (file)
@@ -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
index d000df20514f1050c858ff8a6c7009e87acebfca..94bc3976db0db79ae0e1470ca1bdd38622eaa522 100644 (file)
@@ -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;
 }