gh-124621: Emscripten: Support pyrepl in browser (GH-136931)

Basic support for pyrepl in Emscripten. Limitations:
* requires JSPI
* no signal handling implemented

As followup work, it would be nice to implement a webworker variant
for when JSPI is not available and proper signal handling.

Because it requires JSPI, it doesn't work in Safari. Firefox requires
setting an experimental flag. All the Chromiums have full support since
May. Until we make it work without JSPI, let's keep the original web_example
around.

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
Co-authored-by: Éric <merwok@netwok.org>
This commit is contained in:
Hood Chatham 2025-07-22 12:13:38 +02:00 committed by GitHub
parent 22c8658906
commit c933a6bb32
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 505 additions and 40 deletions

View file

@ -1,6 +1,7 @@
from __future__ import annotations
import os
import sys
# types
if False:
@ -12,10 +13,22 @@
trace_file = open(trace_filename, "a")
def trace(line: str, *k: object, **kw: object) -> None:
if trace_file is None:
return
if k or kw:
line = line.format(*k, **kw)
trace_file.write(line + "\n")
trace_file.flush()
if sys.platform == "emscripten":
from posix import _emscripten_log
def trace(line: str, *k: object, **kw: object) -> None:
if "PYREPL_TRACE" not in os.environ:
return
if k or kw:
line = line.format(*k, **kw)
_emscripten_log(line)
else:
def trace(line: str, *k: object, **kw: object) -> None:
if trace_file is None:
return
if k or kw:
line = line.format(*k, **kw)
trace_file.write(line + "\n")
trace_file.flush()