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

This commit is contained in:
Mark Dickinson 2010-04-06 15:19:40 +00:00
parent f6224e799c
commit e9a5a549e4
2 changed files with 30 additions and 6 deletions

View File

@ -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

View File

@ -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;