gh-130382: add missing _PyReftracerTrack
to ceval Py_DECREF
(#130689)
This commit is contained in:
parent
3a91ee9724
commit
c5abded099
@ -2884,5 +2884,22 @@ class TestVersions(unittest.TestCase):
|
||||
self.assertEqual(result, expected)
|
||||
|
||||
|
||||
class TestCEval(unittest.TestCase):
|
||||
def test_ceval_decref(self):
|
||||
code = textwrap.dedent("""
|
||||
import _testcapi
|
||||
_testcapi.toggle_reftrace_printer(True)
|
||||
l1 = []
|
||||
l2 = []
|
||||
del l1
|
||||
del l2
|
||||
_testcapi.toggle_reftrace_printer(False)
|
||||
""")
|
||||
_, out, _ = assert_python_ok("-c", code)
|
||||
lines = out.decode("utf-8").splitlines()
|
||||
self.assertEqual(lines.count("CREATE list"), 2)
|
||||
self.assertEqual(lines.count("DESTROY list"), 2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
@ -0,0 +1 @@
|
||||
Fix ``PyRefTracer_DESTROY`` not being sent from :file:`Python/ceval.c` ``Py_DECREF()``.
|
@ -2515,6 +2515,31 @@ code_offset_to_line(PyObject* self, PyObject* const* args, Py_ssize_t nargsf)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
_reftrace_printer(PyObject *obj, PyRefTracerEvent event, void *counter_data)
|
||||
{
|
||||
if (event == PyRefTracer_CREATE) {
|
||||
printf("CREATE %s\n", Py_TYPE(obj)->tp_name);
|
||||
}
|
||||
else { // PyRefTracer_DESTROY
|
||||
printf("DESTROY %s\n", Py_TYPE(obj)->tp_name);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// A simple reftrace printer for very simple tests
|
||||
static PyObject *
|
||||
toggle_reftrace_printer(PyObject *ob, PyObject *arg)
|
||||
{
|
||||
if (arg == Py_True) {
|
||||
PyRefTracer_SetTracer(_reftrace_printer, NULL);
|
||||
}
|
||||
else {
|
||||
PyRefTracer_SetTracer(NULL, NULL);
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyMethodDef TestMethods[] = {
|
||||
{"set_errno", set_errno, METH_VARARGS},
|
||||
{"test_config", test_config, METH_NOARGS},
|
||||
@ -2608,6 +2633,7 @@ static PyMethodDef TestMethods[] = {
|
||||
{"finalize_thread_hang", finalize_thread_hang, METH_O, NULL},
|
||||
{"test_atexit", test_atexit, METH_NOARGS},
|
||||
{"code_offset_to_line", _PyCFunction_CAST(code_offset_to_line), METH_FASTCALL},
|
||||
{"toggle_reftrace_printer", toggle_reftrace_printer, METH_O},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
@ -80,6 +80,7 @@
|
||||
} \
|
||||
_Py_DECREF_STAT_INC(); \
|
||||
if (--op->ob_refcnt == 0) { \
|
||||
_PyReftracerTrack(op, PyRefTracer_DESTROY); \
|
||||
destructor dealloc = Py_TYPE(op)->tp_dealloc; \
|
||||
(*dealloc)(op); \
|
||||
} \
|
||||
|
Loading…
x
Reference in New Issue
Block a user