From d2d3d4dcdc2182e8e126c73473108eeb50eb25e7 Mon Sep 17 00:00:00 2001 From: EXPLOSION Date: Mon, 27 May 2024 12:23:31 +0200 Subject: [PATCH] Fixes for 3.13 --- trio/_core/_generated_instrumentation.py | 5 +++-- trio/_core/_generated_io_epoll.py | 6 +++--- trio/_core/_generated_io_kqueue.py | 12 ++++++------ trio/_core/_generated_io_windows.py | 18 +++++++++--------- trio/_core/_generated_run.py | 17 +++++++++-------- trio/_core/_ki.py | 2 +- trio/_core/_run.py | 6 +++--- trio/_tests/test_path.py | 2 +- 8 files changed, 35 insertions(+), 33 deletions(-) diff --git a/trio/_core/_generated_instrumentation.py b/trio/_core/_generated_instrumentation.py index c7fefc3..990c405 100644 --- a/trio/_core/_generated_instrumentation.py +++ b/trio/_core/_generated_instrumentation.py @@ -3,6 +3,7 @@ # ************************************************************* from __future__ import annotations +import sys from ._instrumentation import Instrument from ._ki import LOCALS_KEY_KI_PROTECTION_ENABLED from ._run import GLOBAL_RUN_CONTEXT @@ -17,7 +18,7 @@ def add_instrument(instrument: Instrument) -> None: If ``instrument`` is already active, does nothing. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.instruments.add_instrument(instrument) except AttributeError: @@ -37,7 +38,7 @@ def remove_instrument(instrument: Instrument) -> None: deactivated. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.instruments.remove_instrument(instrument) except AttributeError: diff --git a/trio/_core/_generated_io_epoll.py b/trio/_core/_generated_io_epoll.py index f80e988..7927f79 100644 --- a/trio/_core/_generated_io_epoll.py +++ b/trio/_core/_generated_io_epoll.py @@ -16,7 +16,7 @@ assert not TYPE_CHECKING or sys.platform == "linux" async def wait_readable(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_readable(fd) except AttributeError: @@ -24,7 +24,7 @@ async def wait_readable(fd: (int | _HasFileNo)) -> None: async def wait_writable(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_writable(fd) except AttributeError: @@ -32,7 +32,7 @@ async def wait_writable(fd: (int | _HasFileNo)) -> None: def notify_closing(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.notify_closing(fd) except AttributeError: diff --git a/trio/_core/_generated_io_kqueue.py b/trio/_core/_generated_io_kqueue.py index b572831..1dd0626 100644 --- a/trio/_core/_generated_io_kqueue.py +++ b/trio/_core/_generated_io_kqueue.py @@ -20,7 +20,7 @@ assert not TYPE_CHECKING or sys.platform == "darwin" def current_kqueue() -> select.kqueue: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.current_kqueue() except AttributeError: @@ -30,7 +30,7 @@ def current_kqueue() -> select.kqueue: def monitor_kevent( ident: int, filter: int ) -> ContextManager[_core.UnboundedQueue[select.kevent]]: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.monitor_kevent(ident, filter) except AttributeError: @@ -40,7 +40,7 @@ def monitor_kevent( async def wait_kevent( ident: int, filter: int, abort_func: Callable[[RaiseCancelT], Abort] ) -> Abort: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_kevent( ident, filter, abort_func @@ -50,7 +50,7 @@ async def wait_kevent( async def wait_readable(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_readable(fd) except AttributeError: @@ -58,7 +58,7 @@ async def wait_readable(fd: (int | _HasFileNo)) -> None: async def wait_writable(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_writable(fd) except AttributeError: @@ -66,7 +66,7 @@ async def wait_writable(fd: (int | _HasFileNo)) -> None: def notify_closing(fd: (int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.notify_closing(fd) except AttributeError: diff --git a/trio/_core/_generated_io_windows.py b/trio/_core/_generated_io_windows.py index e859829..f0bef74 100644 --- a/trio/_core/_generated_io_windows.py +++ b/trio/_core/_generated_io_windows.py @@ -20,7 +20,7 @@ assert not TYPE_CHECKING or sys.platform == "win32" async def wait_readable(sock: (_HasFileNo | int)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_readable(sock) except AttributeError: @@ -28,7 +28,7 @@ async def wait_readable(sock: (_HasFileNo | int)) -> None: async def wait_writable(sock: (_HasFileNo | int)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_writable(sock) except AttributeError: @@ -36,7 +36,7 @@ async def wait_writable(sock: (_HasFileNo | int)) -> None: def notify_closing(handle: (Handle | int | _HasFileNo)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.notify_closing(handle) except AttributeError: @@ -44,7 +44,7 @@ def notify_closing(handle: (Handle | int | _HasFileNo)) -> None: def register_with_iocp(handle: (int | CData)) -> None: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.register_with_iocp(handle) except AttributeError: @@ -54,7 +54,7 @@ def register_with_iocp(handle: (int | CData)) -> None: async def wait_overlapped( handle_: (int | CData), lpOverlapped: (CData | int) ) -> object: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.wait_overlapped( handle_, lpOverlapped @@ -66,7 +66,7 @@ async def wait_overlapped( async def write_overlapped( handle: (int | CData), data: Buffer, file_offset: int = 0 ) -> int: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.write_overlapped( handle, data, file_offset @@ -78,7 +78,7 @@ async def write_overlapped( async def readinto_overlapped( handle: (int | CData), buffer: Buffer, file_offset: int = 0 ) -> int: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.io_manager.readinto_overlapped( handle, buffer, file_offset @@ -88,7 +88,7 @@ async def readinto_overlapped( def current_iocp() -> int: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.current_iocp() except AttributeError: @@ -96,7 +96,7 @@ def current_iocp() -> int: def monitor_completion_key() -> ContextManager[tuple[int, UnboundedQueue[object]]]: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.io_manager.monitor_completion_key() except AttributeError: diff --git a/trio/_core/_generated_run.py b/trio/_core/_generated_run.py index 399e1db..6bfc5f2 100644 --- a/trio/_core/_generated_run.py +++ b/trio/_core/_generated_run.py @@ -3,6 +3,7 @@ # ************************************************************* from __future__ import annotations +import sys import contextvars from collections.abc import Awaitable, Callable from typing import Any @@ -38,7 +39,7 @@ def current_statistics() -> RunStatistics: other attributes vary between backends. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.current_statistics() except AttributeError: @@ -55,7 +56,7 @@ def current_time() -> float: RuntimeError: if not inside a call to :func:`trio.run`. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.current_time() except AttributeError: @@ -64,7 +65,7 @@ def current_time() -> float: def current_clock() -> Clock: """Returns the current :class:`~trio.abc.Clock`.""" - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.current_clock() except AttributeError: @@ -77,7 +78,7 @@ def current_root_task() -> Task | None: This is the task that is the ultimate parent of all other tasks. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.current_root_task() except AttributeError: @@ -102,7 +103,7 @@ def reschedule(task: Task, next_send: Outcome[Any] = _NO_SEND) -> None: raise) from :func:`wait_task_rescheduled`. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.reschedule(task, next_send) except AttributeError: @@ -166,7 +167,7 @@ def spawn_system_task( Task: the newly spawned task """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.spawn_system_task( async_fn, *args, name=name, context=context @@ -180,7 +181,7 @@ def current_trio_token() -> TrioToken: :func:`trio.run`. """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return GLOBAL_RUN_CONTEXT.runner.current_trio_token() except AttributeError: @@ -245,7 +246,7 @@ async def wait_all_tasks_blocked(cushion: float = 0.0) -> None: print("FAIL") """ - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True try: return await GLOBAL_RUN_CONTEXT.runner.wait_all_tasks_blocked(cushion) except AttributeError: diff --git a/trio/_core/_ki.py b/trio/_core/_ki.py index 0ea3461..a5e32d5 100644 --- a/trio/_core/_ki.py +++ b/trio/_core/_ki.py @@ -176,7 +176,7 @@ def _ki_protection_decorator( @wraps(fn) def wrapper(*args: ArgsT.args, **kwargs: ArgsT.kwargs) -> RetT: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = enabled + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = enabled return fn(*args, **kwargs) return wrapper diff --git a/trio/_core/_run.py b/trio/_core/_run.py index b5a4912..16657c0 100644 --- a/trio/_core/_run.py +++ b/trio/_core/_run.py @@ -617,7 +617,7 @@ class CancelScope: # This inlines the enable_ki_protection decorator so we can fix # f_locals *locally* below to avoid reference cycles - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True # Tracebacks show the 'raise' line below out of context, so let's give # this variable a name that makes sense out of context. @@ -640,7 +640,7 @@ class CancelScope: # see test_cancel_scope_exit_doesnt_create_cyclic_garbage del remaining_error_after_cancel_scope, value, _, exc # deep magic to remove refs via f_locals - locals() + sys._getframe().f_locals # TODO: check if PEP558 changes the need for this call # https://github.com/python/cpython/pull/3640 @@ -2409,7 +2409,7 @@ def unrolled_run( args: tuple[object, ...], host_uses_signal_set_wakeup_fd: bool = False, ) -> Generator[float, EventResult, None]: - locals()[LOCALS_KEY_KI_PROTECTION_ENABLED] = True + sys._getframe().f_locals[LOCALS_KEY_KI_PROTECTION_ENABLED] = True __tracebackhide__ = True try: diff --git a/trio/_tests/test_path.py b/trio/_tests/test_path.py index 3528053..dd3ec66 100644 --- a/trio/_tests/test_path.py +++ b/trio/_tests/test_path.py @@ -120,7 +120,7 @@ async def test_async_method_signature(path: trio.Path) -> None: assert path.resolve.__qualname__ == "Path.resolve" assert path.resolve.__doc__ is not None - assert "pathlib.Path.resolve" in path.resolve.__doc__ + assert path.resolve.__qualname__ in path.resolve.__doc__ @pytest.mark.parametrize("method_name", ["is_dir", "is_file"]) -- 2.44.0