mirror of https://github.com/python/cpython
Fix incorrect stacklevel for struct warnings. (Partial backport of r78690).
This commit is contained in:
parent
f6224e799c
commit
e9a5a549e4
|
@ -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):
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue