]> granicus.if.org Git - python/commitdiff
Fix incorrect stacklevel for struct warnings. (Partial backport of r78690).
authorMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 15:19:40 +0000 (15:19 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 15:19:40 +0000 (15:19 +0000)
Lib/test/test_struct.py
Modules/_struct.c

index cda7dee6cd444e7312adb2982cf4e1aebb9b32a1..ad754df51ac3274ce0aca32495a6a640c728b020 100644 (file)
@@ -2,6 +2,7 @@ import array
 import unittest
 import struct
 import warnings
+import inspect
 warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated",
                         DeprecationWarning)
 
@@ -106,6 +107,29 @@ class StructTest(unittest.TestCase):
         self.assertRaises(struct.error, struct.unpack, 'iii', s)
         self.assertRaises(struct.error, struct.unpack, 'i', s)
 
+    def test_warnings_stacklevel(self):
+        # Python versions between 2.6 and 2.6.5 were producing
+        # warning messages at the wrong stacklevel.
+        def inner(fn, *args):
+            return inspect.currentframe().f_lineno, fn(*args)
+
+        def check_warning_stacklevel(fn, *args):
+            with warnings.catch_warnings(record=True) as w:
+                # "always" to make sure __warningregistry__ isn't affected
+                warnings.simplefilter("always")
+                lineno, result = inner(fn, *args)
+            for warn in w:
+                self.assertEqual(warn.lineno, lineno)
+
+        # out of range warnings
+        check_warning_stacklevel(struct.pack, '<L', -1)
+        check_warning_stacklevel(struct.pack, 'L', -1)
+        check_warning_stacklevel(struct.pack, '<h', 65536)
+        check_warning_stacklevel(struct.pack, '<l', 2**100)
+
+        # float warnings
+        check_warning_stacklevel(struct.pack, 'L', 3.1)
+
     def test_transitiveness(self):
         c = 'a'
         b = 1
index ff1aca26c7f2ec27bcab9bd9eb6488e9c82d8796..d924cad63b9f3c43d533da947c2a4012d1a060d0 100644 (file)
@@ -160,7 +160,7 @@ get_long(PyObject *v, long *p)
                        PyObject *o;
                        int res;
                        PyErr_Clear();
-                       if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0)
+                       if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
                                return -1;
                        o = PyNumber_Int(v);
                        if (o == NULL)
@@ -269,7 +269,7 @@ get_wrapped_long(PyObject *v, long *p)
                                PyObject *o;
                                int res;
                                PyErr_Clear();
-                               if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0)
+                               if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
                                        return -1;
                                o = PyNumber_Int(v);
                                if (o == NULL)
@@ -279,7 +279,7 @@ get_wrapped_long(PyObject *v, long *p)
                                return res;
                        }
 #endif
-                       if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0)
+                       if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 1) < 0)
                                return -1;
                        wrapped = PyNumber_And(v, pylong_ulong_mask);
                        if (wrapped == NULL)
@@ -308,7 +308,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p)
                        PyObject *o;
                        int res;
                        PyErr_Clear();
-                       if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0)
+                       if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
                                return -1;
                        o = PyNumber_Int(v);
                        if (o == NULL)
@@ -321,7 +321,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p)
                wrapped = PyNumber_And(v, pylong_ulong_mask);
                if (wrapped == NULL)
                        return -1;
-               if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0) {
+               if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 1) < 0) {
                        Py_DECREF(wrapped);
                        return -1;
                }
@@ -417,7 +417,7 @@ _range_error(const formatdef *f, int is_unsigned)
                if (msg == NULL)
                        return -1;
                rval = PyErr_WarnEx(PyExc_DeprecationWarning,
-                                   PyString_AS_STRING(msg), 2);
+                                   PyString_AS_STRING(msg), 1);
                Py_DECREF(msg);
                if (rval == 0)
                        return 0;