]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
gh-115999: Enable specialization of `CALL` instructions in free-threaded builds ...
authormpage <mpage@meta.com>
Tue, 3 Dec 2024 19:20:20 +0000 (11:20 -0800)
committerGitHub <noreply@github.com>
Tue, 3 Dec 2024 19:20:20 +0000 (11:20 -0800)
commitdabcecfd6dadb9430733105ba36925b290343d31
tree56bd2af5b31dbc182c6cd7c81a33745112871391
parentfc5a0dc22483a35068888e828c65796d7a792c14
gh-115999: Enable specialization of `CALL` instructions in free-threaded builds (#127123)

The CALL family of instructions were mostly thread-safe already and only required a small number of changes, which are documented below.

A few changes were needed to make CALL_ALLOC_AND_ENTER_INIT thread-safe:

Added _PyType_LookupRefAndVersion, which returns the type version corresponding to the returned ref.

Added _PyType_CacheInitForSpecialization, which takes an init method and the corresponding type version and only populates the specialization cache if the current type version matches the supplied version. This prevents potentially caching a stale value in free-threaded builds if we race with an update to __init__.

Only cache __init__ functions that are deferred in free-threaded builds. This ensures that the reference to __init__ that is stored in the specialization cache is valid if the type version guard in _CHECK_AND_ALLOCATE_OBJECT passes.
Fix a bug in _CREATE_INIT_FRAME where the frame is pushed to the stack on failure.

A few other miscellaneous changes were also needed:

Use {LOCK,UNLOCK}_OBJECT in LIST_APPEND. This ensures that the list's per-object lock is held while we are appending to it.

Add missing co_tlbc for _Py_InitCleanup.

Stop/start the world around setting the eval frame hook. This allows us to read interp->eval_frame non-atomically and preserves the behavior of _CHECK_PEP_523 documented below.
Include/internal/pycore_object.h
Lib/test/test_monitoring.py
Lib/test/test_opcache.py
Lib/test/test_type_cache.py
Objects/typeobject.c
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h
Python/perf_trampoline.c
Python/pystate.c
Python/specialize.c