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)
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.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[] = {
|
static PyMethodDef TestMethods[] = {
|
||||||
{"set_errno", set_errno, METH_VARARGS},
|
{"set_errno", set_errno, METH_VARARGS},
|
||||||
{"test_config", test_config, METH_NOARGS},
|
{"test_config", test_config, METH_NOARGS},
|
||||||
@ -2608,6 +2633,7 @@ static PyMethodDef TestMethods[] = {
|
|||||||
{"finalize_thread_hang", finalize_thread_hang, METH_O, NULL},
|
{"finalize_thread_hang", finalize_thread_hang, METH_O, NULL},
|
||||||
{"test_atexit", test_atexit, METH_NOARGS},
|
{"test_atexit", test_atexit, METH_NOARGS},
|
||||||
{"code_offset_to_line", _PyCFunction_CAST(code_offset_to_line), METH_FASTCALL},
|
{"code_offset_to_line", _PyCFunction_CAST(code_offset_to_line), METH_FASTCALL},
|
||||||
|
{"toggle_reftrace_printer", toggle_reftrace_printer, METH_O},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
} \
|
} \
|
||||||
_Py_DECREF_STAT_INC(); \
|
_Py_DECREF_STAT_INC(); \
|
||||||
if (--op->ob_refcnt == 0) { \
|
if (--op->ob_refcnt == 0) { \
|
||||||
|
_PyReftracerTrack(op, PyRefTracer_DESTROY); \
|
||||||
destructor dealloc = Py_TYPE(op)->tp_dealloc; \
|
destructor dealloc = Py_TYPE(op)->tp_dealloc; \
|
||||||
(*dealloc)(op); \
|
(*dealloc)(op); \
|
||||||
} \
|
} \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user