From ad40ef075033224bc6accc177fa44a67fa35106c Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 2 Jun 2026 10:54:37 -0700 Subject: [PATCH 1/3] Make host callback result cap configurable, refs #5 Raise the default host callback result size from 64 KiB to 256 KiB and expose a host_result_bytes option on run(), run_micropython_wasi(), MicroPythonSession, and MicroPythonReplaySession. Wire the configured limit through a new micropython_wasm.host_result_cap import so the guest C host module can allocate according to the runtime setting instead of relying on a compile-time constant. Reuse the guest-side result buffer across host calls and register it as a MicroPython VM root, avoiding repeated large heap allocations while keeping the buffer visible to the GC. Increase the default fuel budget from 5M to 20M to match the 4x larger default host result cap, update the README examples and argument docs, and add tests for the new default, lower configured limits, and host_result_bytes validation. Rebuild the packaged micropython-wasi.wasm artifact so it includes the new host_result_cap import and reusable buffer behavior. --- README.md | 11 +++- micropython_wasm/__init__.py | 62 +++++++++++++++--- .../artifacts/micropython-wasi.wasm | Bin 370830 -> 370907 bytes .../usercmodule/host/hostmodule.c | 31 +++++++-- tests/test_host_functions.py | 47 ++++++++++++- tests/test_micropython_wasm.py | 3 + 6 files changed, 135 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 59a2744..dee672c 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,9 @@ from micropython_wasm import run result = run( "print(sum(range(10)))", memory_bytes=16 * 1024 * 1024, - fuel=5_000_000, + fuel=20_000_000, wall_timeout_seconds=1.0, + host_result_bytes=256 * 1024, ) ``` @@ -130,6 +131,8 @@ Arguments: `/input`, with read-only WASI directory and file permissions. - `host_functions`: optional mapping of host function names to Python callables. This enables the low-level `host.call(name, payload_json)` bridge. +- `host_result_bytes`: maximum serialized host callback response size. The + default is `256 * 1024`. ### `run_micropython_wasi(code, wasm_path, ...)` @@ -176,9 +179,10 @@ function arguments as `run()`: ```python session = MicroPythonSession( memory_bytes=16 * 1024 * 1024, - fuel=5_000_000, + fuel=20_000_000, readonly_dir="fixtures", host_functions={"add": lambda a, b: a + b}, + host_result_bytes=256 * 1024, ) ``` @@ -234,9 +238,10 @@ session.close() ```python session = MicroPythonReplaySession( memory_bytes=16 * 1024 * 1024, - fuel=5_000_000, + fuel=20_000_000, wall_timeout_seconds=1.0, readonly_dir="fixtures", + host_result_bytes=256 * 1024, ) ``` diff --git a/micropython_wasm/__init__.py b/micropython_wasm/__init__.py index c45e0b4..271b06d 100644 --- a/micropython_wasm/__init__.py +++ b/micropython_wasm/__init__.py @@ -8,6 +8,9 @@ from pathlib import Path from typing import Callable, Mapping, Optional +DEFAULT_HOST_RESULT_BYTES = 256 * 1024 +DEFAULT_FUEL = 20_000_000 + __all__ = [ "MicroPythonWasmError", "MicroPythonWasmArtifactNotFound", @@ -97,10 +100,11 @@ def __init__( wasm_path: str | Path | None = None, *, memory_bytes: int = 16 * 1024 * 1024, - fuel: int = 5_000_000, + fuel: int = DEFAULT_FUEL, wall_timeout_seconds: Optional[float] = 1.0, readonly_dir: str | Path | None = None, host_functions: Mapping[str, Callable[..., object]] | None = None, + host_result_bytes: int = DEFAULT_HOST_RESULT_BYTES, ) -> None: self.wasm_path = ( Path(wasm_path) if wasm_path is not None else default_wasm_path() @@ -109,6 +113,7 @@ def __init__( self.fuel = fuel self.wall_timeout_seconds = wall_timeout_seconds self.readonly_dir = readonly_dir + self.host_result_bytes = host_result_bytes self._snippets: list[str] = [] self._preamble: list[str] = [] self._host_functions: dict[str, Callable[..., object]] = {} @@ -170,6 +175,7 @@ def run(self, code: str) -> RunResult: wall_timeout_seconds=self.wall_timeout_seconds, readonly_dir=self.readonly_dir, host_functions=self._host_functions, + host_result_bytes=self.host_result_bytes, ) marker_with_newline = marker + "\n" if marker_with_newline not in result.stdout: @@ -208,10 +214,11 @@ def __init__( wasm_path: str | Path | None = None, *, memory_bytes: int = 16 * 1024 * 1024, - fuel: int = 5_000_000, + fuel: int = DEFAULT_FUEL, wall_timeout_seconds: Optional[float] = None, readonly_dir: str | Path | None = None, host_functions: Mapping[str, Callable[..., object]] | None = None, + host_result_bytes: int = DEFAULT_HOST_RESULT_BYTES, ) -> None: self.wasm_path = ( Path(wasm_path) if wasm_path is not None else default_wasm_path() @@ -220,6 +227,7 @@ def __init__( self.fuel = fuel self.wall_timeout_seconds = wall_timeout_seconds self.readonly_dir = readonly_dir + self.host_result_bytes = host_result_bytes self._host_functions: dict[str, Callable[..., object]] = {} self._pending_preamble: list[str] = [] self._closed = False @@ -392,6 +400,7 @@ def _run_bootstrap(self) -> None: self.memory_bytes, self.fuel, self.wall_timeout_seconds, + self.host_result_bytes, ) cfg = Config() @@ -451,7 +460,15 @@ def capture_stderr(data: bytes) -> None: with self._callback_lock: host_functions.update(self._host_functions) self._thread_host_functions = host_functions - _define_host_call(linker, store, host_functions, Func, FuncType, ValType) + _define_host_call( + linker, + store, + host_functions, + self.host_result_bytes, + Func, + FuncType, + ValType, + ) try: try: @@ -543,10 +560,11 @@ def run( wasm_path: str | Path | None = None, *, memory_bytes: int = 16 * 1024 * 1024, - fuel: int = 5_000_000, + fuel: int = DEFAULT_FUEL, wall_timeout_seconds: Optional[float] = 1.0, readonly_dir: str | Path | None = None, host_functions: Mapping[str, Callable[..., object]] | None = None, + host_result_bytes: int = DEFAULT_HOST_RESULT_BYTES, ) -> RunResult: """Run MicroPython code in a fresh WASI WebAssembly instance.""" @@ -558,6 +576,7 @@ def run( wall_timeout_seconds=wall_timeout_seconds, readonly_dir=readonly_dir, host_functions=host_functions, + host_result_bytes=host_result_bytes, ) @@ -566,10 +585,11 @@ def run_micropython_wasi( wasm_path: str | Path, *, memory_bytes: int = 16 * 1024 * 1024, - fuel: int = 5_000_000, + fuel: int = DEFAULT_FUEL, wall_timeout_seconds: Optional[float] = 1.0, readonly_dir: str | Path | None = None, host_functions: Mapping[str, Callable[..., object]] | None = None, + host_result_bytes: int = DEFAULT_HOST_RESULT_BYTES, ) -> RunResult: """ Run code through a WASI MicroPython command module. @@ -580,7 +600,9 @@ def run_micropython_wasi( """ wasm_path = Path(wasm_path) - _validate_execution_options(wasm_path, memory_bytes, fuel, wall_timeout_seconds) + _validate_execution_options( + wasm_path, memory_bytes, fuel, wall_timeout_seconds, host_result_bytes + ) try: from wasmtime import ( @@ -643,7 +665,13 @@ def capture_stderr(data: bytes) -> None: linker = Linker(engine) linker.define_wasi() _define_host_call( - linker, store, dict(host_functions or {}), Func, FuncType, ValType + linker, + store, + dict(host_functions or {}), + host_result_bytes, + Func, + FuncType, + ValType, ) timer: threading.Timer | None = None @@ -685,6 +713,7 @@ def _validate_execution_options( memory_bytes: int, fuel: int, wall_timeout_seconds: Optional[float], + host_result_bytes: int, ) -> None: if not wasm_path.exists(): raise MicroPythonWasmArtifactNotFound( @@ -701,6 +730,10 @@ def _validate_execution_options( raise ValueError("fuel must be greater than zero") if wall_timeout_seconds is not None and wall_timeout_seconds <= 0: raise ValueError("wall_timeout_seconds must be greater than zero or None") + if host_result_bytes <= 0: + raise ValueError("host_result_bytes must be greater than zero") + if host_result_bytes > 2_147_483_647: + raise ValueError("host_result_bytes must fit in a WebAssembly i32") def _configure_readonly_dir(wasi, readonly_dir: str | Path | None, error_cls) -> None: @@ -723,7 +756,13 @@ def _configure_readonly_dir(wasi, readonly_dir: str | Path | None, error_cls) -> def _define_host_call( - linker, store, host_functions, func_cls, func_type_cls, val_type_cls + linker, + store, + host_functions, + host_result_bytes, + func_cls, + func_type_cls, + val_type_cls, ) -> None: def host_call( caller, @@ -790,3 +829,10 @@ def host_call( "host_call", func_cls(store, ty, host_call, access_caller=True), ) + cap_ty = func_type_cls([], [val_type_cls.i32()]) + linker.define( + store, + "micropython_wasm", + "host_result_cap", + func_cls(store, cap_ty, lambda: host_result_bytes), + ) diff --git a/micropython_wasm/artifacts/micropython-wasi.wasm b/micropython_wasm/artifacts/micropython-wasi.wasm index b388d13be86406dd5f10e557a340b7592ed6359f..4144a543f9369eece650241452f6bbd4a4c5e6cd 100644 GIT binary patch delta 61417 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 KYmoHdnEwX}0hj9l diff --git a/micropython_wasm/usercmodule/host/hostmodule.c b/micropython_wasm/usercmodule/host/hostmodule.c index 4b63294..2657af0 100644 --- a/micropython_wasm/usercmodule/host/hostmodule.c +++ b/micropython_wasm/usercmodule/host/hostmodule.c @@ -1,10 +1,14 @@ #include #include +#include "py/mpstate.h" #include "py/objstr.h" #include "py/runtime.h" -#define HOST_RESULT_CAP (64 * 1024) +#define DEFAULT_HOST_RESULT_CAP (256 * 1024) + +__attribute__((import_module("micropython_wasm"), import_name("host_result_cap"))) +extern int32_t micropython_wasm_host_result_cap(void); __attribute__((import_module("micropython_wasm"), import_name("host_call"))) extern int32_t micropython_wasm_host_call( @@ -21,7 +25,21 @@ static mp_obj_t host_call(mp_obj_t name_obj, mp_obj_t payload_obj) { size_t payload_len; const char *name = mp_obj_str_get_data(name_obj, &name_len); const char *payload = mp_obj_str_get_data(payload_obj, &payload_len); - char *result = m_new(char, HOST_RESULT_CAP); + int32_t result_cap = micropython_wasm_host_result_cap(); + if (result_cap <= 0) { + result_cap = DEFAULT_HOST_RESULT_CAP; + } + char *result = MP_STATE_VM(host_result_buffer); + if ((size_t)result_cap > MP_STATE_VM(host_result_buffer_cap)) { + result = m_renew( + char, + result, + MP_STATE_VM(host_result_buffer_cap), + (size_t)result_cap + ); + MP_STATE_VM(host_result_buffer) = result; + MP_STATE_VM(host_result_buffer_cap) = (size_t)result_cap; + } int32_t result_len = micropython_wasm_host_call( name, @@ -29,20 +47,17 @@ static mp_obj_t host_call(mp_obj_t name_obj, mp_obj_t payload_obj) { payload, payload_len, result, - HOST_RESULT_CAP + (size_t)result_cap ); if (result_len < 0) { - m_del(char, result, HOST_RESULT_CAP); mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("host callback failed")); } - if ((size_t)result_len > HOST_RESULT_CAP) { - m_del(char, result, HOST_RESULT_CAP); + if ((size_t)result_len > (size_t)result_cap) { mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("host callback result too large")); } mp_obj_t out = mp_obj_new_str(result, (size_t)result_len); - m_del(char, result, HOST_RESULT_CAP); return out; } static MP_DEFINE_CONST_FUN_OBJ_2(host_call_obj, host_call); @@ -59,3 +74,5 @@ const mp_obj_module_t host_user_cmodule = { }; MP_REGISTER_MODULE(MP_QSTR_host, host_user_cmodule); +MP_REGISTER_ROOT_POINTER(char *host_result_buffer); +MP_REGISTER_ROOT_POINTER(size_t host_result_buffer_cap); diff --git a/tests/test_host_functions.py b/tests/test_host_functions.py index 08ebe43..8e94efc 100644 --- a/tests/test_host_functions.py +++ b/tests/test_host_functions.py @@ -4,7 +4,7 @@ import pytest -from micropython_wasm import MicroPythonSession, default_wasm_path, run +from micropython_wasm import MicroPythonSession, MicroPythonWasmError, default_wasm_path, run pytestmark = pytest.mark.skipif( not default_wasm_path().exists(), @@ -89,6 +89,51 @@ def describe(value): assert result.stdout == "4\n8\nhost,python\n" +def test_run_host_function_allows_256k_results_by_default(): + result = run( + """ +import host +print(len(host.call("large", '{"args": [], "kwargs": {}}'))) +""", + host_functions={"large": lambda: "x" * (128 * 1024)}, + wall_timeout_seconds=None, + ) + + assert result.stdout == "131094\n" + + +def test_run_host_result_bytes_can_lower_result_limit(): + result = run( + """ +import host +try: + host.call("large", '{"args": [], "kwargs": {}}') +except ValueError as ex: + print(str(ex)) +""", + host_functions={"large": lambda: "x" * 2048}, + host_result_bytes=1024, + wall_timeout_seconds=None, + ) + + assert result.stdout == "host callback result too large\n" + + +def test_session_host_result_bytes_can_lower_result_limit(): + session = MicroPythonSession( + host_functions={"large": lambda: "x" * 2048}, + host_result_bytes=1024, + wall_timeout_seconds=None, + ) + try: + with pytest.raises( + MicroPythonWasmError, match="ValueError: host callback result too large" + ): + session.run("large()") + finally: + session.close() + + def test_session_host_function_result_can_be_used_as_session_state(): session = MicroPythonSession( host_functions={"add": lambda a, b: a + b}, wall_timeout_seconds=None diff --git a/tests/test_micropython_wasm.py b/tests/test_micropython_wasm.py index 526b4a9..4505745 100644 --- a/tests/test_micropython_wasm.py +++ b/tests/test_micropython_wasm.py @@ -80,6 +80,9 @@ def test_run_micropython_wasi_validates_resource_limits_before_wasmtime(tmp_path with pytest.raises(ValueError, match="wall_timeout_seconds"): run_micropython_wasi("print(1)", wasm_path, wall_timeout_seconds=0) + with pytest.raises(ValueError, match="host_result_bytes"): + run_micropython_wasi("print(1)", wasm_path, host_result_bytes=0) + def test_build_script_finds_and_copies_unix_wasi_artifact(tmp_path): build_script = load_build_script() From a607f6961f0c209ffe5309da12c67845d4a1d7de Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 2 Jun 2026 11:58:56 -0700 Subject: [PATCH 2/3] RUST_BACKTRACE: full --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cb8443b..9e5fbbd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: test: runs-on: ubuntu-latest env: - RUST_BACKTRACE: "1" + RUST_BACKTRACE: full strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b1c7334..50c29da 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,7 @@ jobs: test: runs-on: ubuntu-latest env: - RUST_BACKTRACE: "1" + RUST_BACKTRACE: full strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] From ac5b88b325da70f843791d22786922b5fbed3899 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 2 Jun 2026 12:08:33 -0700 Subject: [PATCH 3/3] Clear session thread tracebacks after Wasmtime traps (fix CI failure on Python 3.11) Persistent sessions run Wasmtime in a background Python thread. When a wall-clock timeout interrupts guest code, Wasmtime raises a trap inside that thread and _thread_main stores the exception so the foreground run() call can report it. On Linux Python 3.11 with wasmtime 45.0.0, keeping that exception's traceback alive also keeps the _run_bootstrap() frame alive. That frame contains Wasmtime objects such as the engine, store, linker, module, and instance. The Python session thread is joined, but those Rust-backed objects can survive until interpreter shutdown through the traceback reference chain. CI then prints pytest's success summary and aborts during process teardown with a Rust panic from tokio-rt-worker: panic in a function that cannot unwind. Commit 06b58d1 fixed the normal close path by joining timer/session threads and clearing store references, but the trapped timeout path still retained teardown-sensitive Wasmtime state through the saved exception traceback. Detach __traceback__, __cause__, and __context__ before storing the thread error. The public error message is preserved because run() only formats the exception value, while the traceback frame references are released promptly enough for Wasmtime resources to be destroyed before Python shutdown. Add a regression assertion to the timeout test to ensure stored thread errors remain detached from traceback/cause/context chains. Reproduced the abort in Docker with python:3.11-slim and verified the full suite now exits cleanly there as well as locally via uv run pytest. Docker test commands: First reproduced the CI-shaped failure in a one-shot Linux Python 3.11 container: docker run --rm -v "$PWD":/work -w /work -e RUST_BACKTRACE=full python:3.11-slim sh -lc 'python -V && python -m pip install -U pip && pip --version && pip install . --group dev && python - <<"PY" import importlib.metadata print("wasmtime", importlib.metadata.version("wasmtime")) print("pytest", importlib.metadata.version("pytest")) PY python -m pytest' Then kept a container around for focused iteration: docker rm -f mpw311 >/dev/null 2>&1 || true docker run -d --name mpw311 -v "$PWD":/work -w /work -e RUST_BACKTRACE=full python:3.11-slim sleep infinity docker exec mpw311 sh -lc 'python -m pip install -U pip >/dev/null && pip install . --group dev >/dev/null && python - <<"PY" import importlib.metadata print("wasmtime", importlib.metadata.version("wasmtime")) print("pytest", importlib.metadata.version("pytest")) PY' Used the persistent container to isolate and verify the failing test file: docker exec mpw311 sh -lc 'python -m pytest tests/test_persistent_session.py -q; printf "exit=%s\n" "$?"' Finally verified the complete suite exited cleanly after the fix: docker exec mpw311 sh -lc 'python -m pytest -q; printf "exit=%s\n" "$?"' docker rm -f mpw311 --- micropython_wasm/__init__.py | 3 +++ tests/test_persistent_session.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/micropython_wasm/__init__.py b/micropython_wasm/__init__.py index 271b06d..6cf3638 100644 --- a/micropython_wasm/__init__.py +++ b/micropython_wasm/__init__.py @@ -373,6 +373,9 @@ def _thread_main(self) -> None: try: self._run_bootstrap() except BaseException as exc: + exc.__traceback__ = None + exc.__cause__ = None + exc.__context__ = None self._thread_error = exc def _run_bootstrap(self) -> None: diff --git a/tests/test_persistent_session.py b/tests/test_persistent_session.py index 7d31d83..d879377 100644 --- a/tests/test_persistent_session.py +++ b/tests/test_persistent_session.py @@ -148,5 +148,9 @@ def test_persistent_session_wall_timeout_interrupts_infinite_loop(): try: with pytest.raises(MicroPythonWasmError, match="guest trapped"): session.run("while True:\n pass") + assert session._thread_error is not None + assert session._thread_error.__traceback__ is None + assert session._thread_error.__cause__ is None + assert session._thread_error.__context__ is None finally: session.close()