mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
bpo-46417: Clear symtable identifiers at exit (GH-30809)
Add _PySymtable_Fini() function, called by finalize_interp_clear(). Update test_cmd_line.test_showrefcount() to tolerate negative reference count.
This commit is contained in:
parent
1ded8ed8e8
commit
12f4ac3bc8
4 changed files with 25 additions and 3 deletions
|
@ -128,6 +128,8 @@ extern struct symtable* _Py_SymtableStringObjectFlags(
|
||||||
int start,
|
int start,
|
||||||
PyCompilerFlags *flags);
|
PyCompilerFlags *flags);
|
||||||
|
|
||||||
|
extern void _PySymtable_Fini(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -119,7 +119,10 @@ class CmdLineTest(unittest.TestCase):
|
||||||
rc, out, err = run_python('-X', 'showrefcount', '-c', code)
|
rc, out, err = run_python('-X', 'showrefcount', '-c', code)
|
||||||
self.assertEqual(out.rstrip(), b"{'showrefcount': True}")
|
self.assertEqual(out.rstrip(), b"{'showrefcount': True}")
|
||||||
if Py_DEBUG:
|
if Py_DEBUG:
|
||||||
self.assertRegex(err, br'^\[\d+ refs, \d+ blocks\]')
|
# bpo-46417: Tolerate negative reference count which can occur
|
||||||
|
# because of bugs in C extensions. This test is only about checking
|
||||||
|
# the showrefcount feature.
|
||||||
|
self.assertRegex(err, br'^\[-?\d+ refs, \d+ blocks\]')
|
||||||
else:
|
else:
|
||||||
self.assertEqual(err, b'')
|
self.assertEqual(err, b'')
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "pycore_runtime_init.h" // _PyRuntimeState_INIT
|
#include "pycore_runtime_init.h" // _PyRuntimeState_INIT
|
||||||
#include "pycore_sliceobject.h" // _PySlice_Fini()
|
#include "pycore_sliceobject.h" // _PySlice_Fini()
|
||||||
#include "pycore_structseq.h" // _PyStructSequence_InitState()
|
#include "pycore_structseq.h" // _PyStructSequence_InitState()
|
||||||
|
#include "pycore_symtable.h" // _PySymtable_Fini()
|
||||||
#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks()
|
#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks()
|
||||||
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
|
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
|
||||||
#include "pycore_tuple.h" // _PyTuple_InitTypes()
|
#include "pycore_tuple.h" // _PyTuple_InitTypes()
|
||||||
|
@ -1700,6 +1701,9 @@ finalize_interp_clear(PyThreadState *tstate)
|
||||||
int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
|
int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
|
||||||
|
|
||||||
_PyExc_ClearExceptionGroupType(tstate->interp);
|
_PyExc_ClearExceptionGroupType(tstate->interp);
|
||||||
|
if (is_main_interp) {
|
||||||
|
_PySymtable_Fini();
|
||||||
|
}
|
||||||
|
|
||||||
/* Clear interpreter state and all thread states */
|
/* Clear interpreter state and all thread states */
|
||||||
_PyInterpreterState_Clear(tstate);
|
_PyInterpreterState_Clear(tstate);
|
||||||
|
|
|
@ -1121,7 +1121,7 @@ static int
|
||||||
symtable_add_def(struct symtable *st, PyObject *name, int flag,
|
symtable_add_def(struct symtable *st, PyObject *name, int flag,
|
||||||
int lineno, int col_offset, int end_lineno, int end_col_offset)
|
int lineno, int col_offset, int end_lineno, int end_col_offset)
|
||||||
{
|
{
|
||||||
return symtable_add_def_helper(st, name, flag, st->st_cur,
|
return symtable_add_def_helper(st, name, flag, st->st_cur,
|
||||||
lineno, col_offset, end_lineno, end_col_offset);
|
lineno, col_offset, end_lineno, end_col_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2134,7 +2134,7 @@ symtable_raise_if_annotation_block(struct symtable *st, const char *name, expr_t
|
||||||
static int
|
static int
|
||||||
symtable_raise_if_comprehension_block(struct symtable *st, expr_ty e) {
|
symtable_raise_if_comprehension_block(struct symtable *st, expr_ty e) {
|
||||||
_Py_comprehension_ty type = st->st_cur->ste_comprehension;
|
_Py_comprehension_ty type = st->st_cur->ste_comprehension;
|
||||||
PyErr_SetString(PyExc_SyntaxError,
|
PyErr_SetString(PyExc_SyntaxError,
|
||||||
(type == ListComprehension) ? "'yield' inside list comprehension" :
|
(type == ListComprehension) ? "'yield' inside list comprehension" :
|
||||||
(type == SetComprehension) ? "'yield' inside set comprehension" :
|
(type == SetComprehension) ? "'yield' inside set comprehension" :
|
||||||
(type == DictComprehension) ? "'yield' inside dict comprehension" :
|
(type == DictComprehension) ? "'yield' inside dict comprehension" :
|
||||||
|
@ -2173,3 +2173,16 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename,
|
||||||
_PyArena_Free(arena);
|
_PyArena_Free(arena);
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_PySymtable_Fini(void)
|
||||||
|
{
|
||||||
|
Py_CLEAR(top);
|
||||||
|
Py_CLEAR(lambda);
|
||||||
|
Py_CLEAR(genexpr);
|
||||||
|
Py_CLEAR(listcomp);
|
||||||
|
Py_CLEAR(setcomp);
|
||||||
|
Py_CLEAR(dictcomp);
|
||||||
|
Py_CLEAR(__class__);
|
||||||
|
Py_CLEAR(_annotation);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue