mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
[3.13] gh-131927: Prevent emitting compiler warnings twice (GH-131993) (GH-132463)
(cherry picked from commit 3d08c8ad20
)
This commit is contained in:
parent
ff66901d8a
commit
4ff5d88fb1
4 changed files with 48 additions and 2 deletions
|
@ -18,3 +18,9 @@ PyAPI_FUNC(int) PyErr_WarnExplicitFormat(
|
|||
|
||||
// DEPRECATED: Use PyErr_WarnEx() instead.
|
||||
#define PyErr_Warn(category, msg) PyErr_WarnEx((category), (msg), 1)
|
||||
|
||||
int _PyErr_WarnExplicitObjectWithContext(
|
||||
PyObject *category,
|
||||
PyObject *message,
|
||||
PyObject *filename,
|
||||
int lineno);
|
||||
|
|
|
@ -1512,6 +1512,24 @@ class TestSpecifics(unittest.TestCase):
|
|||
pass
|
||||
[[]]
|
||||
|
||||
def test_compile_warnings(self):
|
||||
# See gh-131927
|
||||
# Compile warnings originating from the same file and
|
||||
# line are now only emitted once.
|
||||
with warnings.catch_warnings(record=True) as caught:
|
||||
warnings.simplefilter("default")
|
||||
compile('1 is 1', '<stdin>', 'eval')
|
||||
compile('1 is 1', '<stdin>', 'eval')
|
||||
|
||||
self.assertEqual(len(caught), 1)
|
||||
|
||||
with warnings.catch_warnings(record=True) as caught:
|
||||
warnings.simplefilter("always")
|
||||
compile('1 is 1', '<stdin>', 'eval')
|
||||
compile('1 is 1', '<stdin>', 'eval')
|
||||
|
||||
self.assertEqual(len(caught), 2)
|
||||
|
||||
@requires_debug_ranges()
|
||||
class TestSourcePositions(unittest.TestCase):
|
||||
# Ensure that compiled code snippets have correct line and column numbers
|
||||
|
|
|
@ -1317,6 +1317,28 @@ PyErr_WarnExplicitObject(PyObject *category, PyObject *message,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Like PyErr_WarnExplicitObject, but automatically sets up context */
|
||||
int
|
||||
_PyErr_WarnExplicitObjectWithContext(PyObject *category, PyObject *message,
|
||||
PyObject *filename, int lineno)
|
||||
{
|
||||
PyObject *unused_filename, *module, *registry;
|
||||
int unused_lineno;
|
||||
int stack_level = 1;
|
||||
|
||||
if (!setup_context(stack_level, NULL, &unused_filename, &unused_lineno,
|
||||
&module, ®istry)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rc = PyErr_WarnExplicitObject(category, message, filename, lineno,
|
||||
module, registry);
|
||||
Py_DECREF(unused_filename);
|
||||
Py_DECREF(registry);
|
||||
Py_DECREF(module);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
PyErr_WarnExplicit(PyObject *category, const char *text,
|
||||
const char *filename_str, int lineno,
|
||||
|
|
|
@ -6616,8 +6616,8 @@ compiler_warn(struct compiler *c, location loc,
|
|||
if (msg == NULL) {
|
||||
return ERROR;
|
||||
}
|
||||
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
|
||||
loc.lineno, NULL, NULL) < 0)
|
||||
if (_PyErr_WarnExplicitObjectWithContext(PyExc_SyntaxWarning, msg,
|
||||
c->c_filename, loc.lineno) < 0)
|
||||
{
|
||||
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
|
||||
/* Replace the SyntaxWarning exception with a SyntaxError
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue