// 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);
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
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,
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