Commit 87d96c36 authored by Mark Dickinson's avatar Mark Dickinson

Fix incorrect stacklevel for struct warnings. (Partial backport of r78690).

parent 8d2d1915
...@@ -2,6 +2,7 @@ import array ...@@ -2,6 +2,7 @@ import array
import unittest import unittest
import struct import struct
import warnings import warnings
import inspect
warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated", warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated",
DeprecationWarning) DeprecationWarning)
...@@ -106,6 +107,29 @@ class StructTest(unittest.TestCase): ...@@ -106,6 +107,29 @@ class StructTest(unittest.TestCase):
self.assertRaises(struct.error, struct.unpack, 'iii', s) self.assertRaises(struct.error, struct.unpack, 'iii', s)
self.assertRaises(struct.error, struct.unpack, 'i', 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): def test_transitiveness(self):
c = 'a' c = 'a'
b = 1 b = 1
......
...@@ -160,7 +160,7 @@ get_long(PyObject *v, long *p) ...@@ -160,7 +160,7 @@ get_long(PyObject *v, long *p)
PyObject *o; PyObject *o;
int res; int res;
PyErr_Clear(); PyErr_Clear();
if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0) if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
return -1; return -1;
o = PyNumber_Int(v); o = PyNumber_Int(v);
if (o == NULL) if (o == NULL)
...@@ -269,7 +269,7 @@ get_wrapped_long(PyObject *v, long *p) ...@@ -269,7 +269,7 @@ get_wrapped_long(PyObject *v, long *p)
PyObject *o; PyObject *o;
int res; int res;
PyErr_Clear(); PyErr_Clear();
if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0) if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
return -1; return -1;
o = PyNumber_Int(v); o = PyNumber_Int(v);
if (o == NULL) if (o == NULL)
...@@ -279,7 +279,7 @@ get_wrapped_long(PyObject *v, long *p) ...@@ -279,7 +279,7 @@ get_wrapped_long(PyObject *v, long *p)
return res; return res;
} }
#endif #endif
if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0) if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 1) < 0)
return -1; return -1;
wrapped = PyNumber_And(v, pylong_ulong_mask); wrapped = PyNumber_And(v, pylong_ulong_mask);
if (wrapped == NULL) if (wrapped == NULL)
...@@ -308,7 +308,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p) ...@@ -308,7 +308,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p)
PyObject *o; PyObject *o;
int res; int res;
PyErr_Clear(); PyErr_Clear();
if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2) < 0) if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1) < 0)
return -1; return -1;
o = PyNumber_Int(v); o = PyNumber_Int(v);
if (o == NULL) if (o == NULL)
...@@ -321,7 +321,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p) ...@@ -321,7 +321,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p)
wrapped = PyNumber_And(v, pylong_ulong_mask); wrapped = PyNumber_And(v, pylong_ulong_mask);
if (wrapped == NULL) if (wrapped == NULL)
return -1; return -1;
if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0) { if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 1) < 0) {
Py_DECREF(wrapped); Py_DECREF(wrapped);
return -1; return -1;
} }
...@@ -417,7 +417,7 @@ _range_error(const formatdef *f, int is_unsigned) ...@@ -417,7 +417,7 @@ _range_error(const formatdef *f, int is_unsigned)
if (msg == NULL) if (msg == NULL)
return -1; return -1;
rval = PyErr_WarnEx(PyExc_DeprecationWarning, rval = PyErr_WarnEx(PyExc_DeprecationWarning,
PyString_AS_STRING(msg), 2); PyString_AS_STRING(msg), 1);
Py_DECREF(msg); Py_DECREF(msg);
if (rval == 0) if (rval == 0)
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment