GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — PyRefTracer_DESTROY is not called for objects deferred by the trashcan mechanism · Issue #156371 · python/cpython Closed Closed Copy link Labels 3.14bugs and security fixesbugs and security fixes3.15bugs and security fixesbugs and security fixes3.16new features, bugs and security fixesnew features, bugs and security fixestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error DescriptionBug reportThis works correctly until Python 3.13, but #132280 introduces a regression. import os import subprocess import sys import sysconfig import tempfile CSRC = r""" #include <Python.h> static Py_ssize_t list_destroys = 0; static int tracer(PyObject *obj, PyRefTracerEvent event, void *data) { if (event == PyRefTracer_DESTROY && PyList_CheckExact(obj)) { list_destroys++; } return 0; } static PyObject * start(PyObject *self, PyObject *args) { list_destroys = 0; if (PyRefTracer_SetTracer(tracer, NULL) < 0) { return NULL; } Py_RETURN_NONE; } static PyObject * stop(PyObject *self, PyObject *args) { if (PyRefTracer_SetTracer(NULL, NULL) < 0) { return NULL; } return PyLong_FromSsize_t(list_destroys); } static PyMethodDef methods[] = { {"start", start, METH_NOARGS, NULL}, {"stop", stop, METH_NOARGS, NULL}, {NULL, NULL, 0, NULL}, }; static PyModuleDef_Slot slots[] = { #ifdef Py_GIL_DISABLED {Py_mod_gil, Py_MOD_GIL_NOT_USED}, #endif {0, NULL}, }; static struct PyModuleDef module = { PyModuleDef_HEAD_INIT, .m_name = "reftrace_repro", .m_size = 0, .m_methods = methods, .m_slots = slots, }; PyMODINIT_FUNC PyInit_reftrace_repro(void) { return PyModuleDef_Init(&module); } """ def build_module(): tmpdir = tempfile.mkdtemp(prefix="reftrace_repro_") src = os.path.join(tmpdir, "reftrace_repro.c") with open(src, "w") as f: f.write(CSRC) ext = os.path.join(tmpdir, "reftrace_repro.so") cmd = ["cc", "-O2", "-shared", "-fPIC", "-I", sysconfig.get_path("include"), "-I", sysconfig.get_path("platinclude"), "-o", ext, src] if sys.platform == "darwin": cmd.insert(3, "-undefined") cmd.insert(4, "dynamic_lookup") subprocess.run(cmd, check=True) sys.path.insert(0, tmpdir) def run(depth): import reftrace_repro chain = None for _ in range(depth): chain = [chain] reftrace_repro.start() del chain destroys = reftrace_repro.stop() missing = depth - destroys print(f"depth={depth:>7} DESTROY events={destroys:>7} " f"missing={missing:>5} [{'BUG' if missing else 'OK'}]") if __name__ == "__main__": print(sys.version) build_module() run(100) run(200_000) StatusLinked PRsActivity
MetadataMetadataAssigneesLabels3.14bugs and security fixesbugs and security fixes3.15bugs and security fixesbugs and security fixes3.16new features, bugs and security fixesnew features, bugs and security fixestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error ProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |