summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authormpage <mpage@meta.com>2024-12-19 21:03:14 (GMT)
committerGitHub <noreply@github.com>2024-12-19 21:03:14 (GMT)
commit255762c09fe518757bb3e8ce1bb6e5d8eec9f466 (patch)
tree179d8f0893a0550d2f73359da6e20d4df05e01e2 /Objects
parente163e8d4e1a9844b8615ef38b9917b887a377948 (diff)
downloadcpython-255762c09fe518757bb3e8ce1bb6e5d8eec9f466.zip
cpython-255762c09fe518757bb3e8ce1bb6e5d8eec9f466.tar.gz
cpython-255762c09fe518757bb3e8ce1bb6e5d8eec9f466.tar.bz2
gh-127274: Defer nested methods (#128012)
Methods (functions defined in class scope) are likely to be cleaned up by the GC anyway. Add a new code flag, `CO_METHOD`, that is set for functions defined in a class scope. Use that when deciding to defer functions.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/funcobject.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index cca7f01..7b17a9b 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -210,10 +210,14 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
op->func_typeparams = NULL;
op->vectorcall = _PyFunction_Vectorcall;
op->func_version = FUNC_VERSION_UNSET;
- if ((code_obj->co_flags & CO_NESTED) == 0) {
+ if (((code_obj->co_flags & CO_NESTED) == 0) ||
+ (code_obj->co_flags & CO_METHOD)) {
// Use deferred reference counting for top-level functions, but not
// nested functions because they are more likely to capture variables,
// which makes prompt deallocation more important.
+ //
+ // Nested methods (functions defined in class scope) are also deferred,
+ // since they will likely be cleaned up by GC anyway.
_PyObject_SetDeferredRefcount((PyObject *)op);
}
_PyObject_GC_TRACK(op);