PHP 8.2.30
Preview: _threading_handler.py Size: 2.12 KB
/opt/alt/python313/lib64/python3.13/_pyrepl/_threading_handler.py

from __future__ import annotations

from dataclasses import dataclass, field
import traceback


TYPE_CHECKING = False
if TYPE_CHECKING:
    from threading import Thread
    from types import TracebackType
    from typing import Protocol

    class ExceptHookArgs(Protocol):
        @property
        def exc_type(self) -> type[BaseException]: ...
        @property
        def exc_value(self) -> BaseException | None: ...
        @property
        def exc_traceback(self) -> TracebackType | None: ...
        @property
        def thread(self) -> Thread | None: ...

    class ShowExceptions(Protocol):
        def __call__(self) -> int: ...
        def add(self, s: str) -> None: ...

    from .reader import Reader


def install_threading_hook(reader: Reader) -> None:
    import threading

    @dataclass
    class ExceptHookHandler:
        lock: threading.Lock = field(default_factory=threading.Lock)
        messages: list[str] = field(default_factory=list)

        def show(self) -> int:
            count = 0
            with self.lock:
                if not self.messages:
                    return 0
                reader.restore()
                for tb in self.messages:
                    count += 1
                    if tb:
                        print(tb)
                self.messages.clear()
                reader.scheduled_commands.append("ctrl-c")
                reader.prepare()
            return count

        def add(self, s: str) -> None:
            with self.lock:
                self.messages.append(s)

        def exception(self, args: ExceptHookArgs) -> None:
            lines = traceback.format_exception(
                args.exc_type,
                args.exc_value,
                args.exc_traceback,
                colorize=reader.can_colorize,
            )  # type: ignore[call-overload]
            pre = f"\nException in {args.thread.name}:\n" if args.thread else "\n"
            tb = pre + "".join(lines)
            self.add(tb)

        def __call__(self) -> int:
            return self.show()


    handler = ExceptHookHandler()
    reader.threading_hook = handler
    threading.excepthook = handler.exception

Directory Contents

Dirs: 1 × Files: 26

Name Size Perms Modified Actions
- drwxr-xr-x 2026-02-10 08:06:26
Edit Download
3.75 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
12.01 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
9.81 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
6.71 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
1.21 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
2.51 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
12.93 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
3.69 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
6.31 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
1.89 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
870 B lrw-r--r-- 2025-12-05 16:06:33
Edit Download
5.68 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
27.06 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
19.75 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
5.66 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
433 B lrw-r--r-- 2026-01-10 10:39:00
Edit Download
354 B lrw-r--r-- 2026-01-10 10:39:00
Edit Download
26.09 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
2.46 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
2.39 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
21.11 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
991 B lrw-r--r-- 2026-01-10 10:39:00
Edit Download
1.80 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
2.12 KB lrw-r--r-- 2026-01-10 10:39:00
Edit Download
925 B lrw-r--r-- 2026-01-10 10:39:00
Edit Download
422 B lrw-r--r-- 2026-01-10 10:39:00
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).