Skip to content

0.14.1: the non-local jump boundary stated, a probe kept, and the step that skips until the engine knows the key - #18

Merged
Sunrisepeak merged 3 commits into
mainfrom
abi/longjmp
Nov 11, 2026
Merged

Sunrisepeak merged 3 commits into
mainfrom
abi/longjmp

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

A C program that jumps non-locally -- sigsetjmp at one frame, siglongjmp from two frames below -- dies on the wasm row today: the runtime's JS trampoline reaches outside the linear memory and the process aborts. Straight-line control flow and goto-with-labels work; the jump is what does not. The ABI table already carries two members for exactly this class of decision -- threads and exceptions are link-time, graph-wide, and cannot be a package's private flag -- and this change states the third boundary beside them and keeps the program that will prove the fix.

  • README: one section, abi table context -- non-local jumps on the wasm row are a link-time decision the table makes; until the engine knows the member, they are unsupported (measured on mcpp 2026.11.10.1: the members are threads and exceptions)
  • probe/longjmp/: a self-contained C program (sigsetjmp origin, two nested frames, volatile locals preserved across the jump asserted) with its own manifest declaring the member
  • ci.yml: the step tries the probe; when the engine answers that the abi table has no such member the step reports the skip and passes, any other build failure fails the run, and an engine that knows the member builds and runs the probe under node requiring exit 0 -- the flip from skip to assert is automatic, no change to this repository needed on that day

CI stays green today by construction: the skip path is the asserted behaviour of the current engine, not a suppressed failure.

Sunrisepeak and others added 3 commits November 11, 2026 13:10
…ps until the engine knows the key

- C's non-local jumps are a link-time decision the way -pthread is: setjmp.h
  compiles either way, and whether a siglongjmp over live frames works depends
  on the lowering the whole link chose. The switch belongs to the artefact, so
  the consumer states it in the same abi table threads use:
  [target.'cfg(os = "emscripten")'.abi] longjmp = "wasm". Without the table,
  non-local jumps are not supported
- probe/longjmp/ is a C program whose siglongjmp crosses two frames, each
  holding a volatile local the jump must not have restored, and a second jump
  returns over both to the origin
- continuous integration attempts that probe's build: an engine without the
  member refuses the manifest naming it, the step reads the refusal and
  reports a skip; an engine that resolves the key builds it, runs it under
  node, and the step is the gate that turns with the engine's release
Nothing the twelve interfaces do. C's non-local jumps are stated as a
link-time decision of the artefact (longjmp = "wasm" in the same abi table
threads use), the probe program probe/longjmp/ carries the assertion, and
continuous integration runs it once an engine resolves the key, reporting a
skip until one does.
@Sunrisepeak
Sunrisepeak merged commit d0a9a11 into main Nov 11, 2026
2 checks passed
@Sunrisepeak
Sunrisepeak deleted the abi/longjmp branch November 11, 2026 19:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant