52 lines
2.2 KiB
Markdown
52 lines
2.2 KiB
Markdown
# spikes/wasm-phase2 — core module + membrane scaffold
|
|
|
|
Phase 2 validates the next WASM step without the Phase 3 dynamic loader. The
|
|
scaffold compiles a native UCE core subset (`Request`, `DValue`, UCEB1, print
|
|
buffering) plus one statically linked real `.uce` page into a WASM reactor.
|
|
A small Wasmtime C-API host provides the first membrane hostcalls, sends a UCEB1
|
|
request context into the guest, invokes render, and reads the response from
|
|
linear memory. `uce_host_ctx_read(ptr, cap)` follows a length-query contract:
|
|
`ptr == 0` or `cap == 0` returns the required length; a short non-zero buffer
|
|
also returns the required length without a partial copy; an adequately sized
|
|
buffer receives the full context and returns the copied length.
|
|
|
|
This is intentionally not the final worker. It proves the Phase 2 membrane path:
|
|
core-owned DValue/UCEB1 code runs in WASM and a `.uce` render entry sees a
|
|
host-provided request context through the membrane. The checked-in page uses the
|
|
same `RENDER(Request&)` entry shape as generated units, but it is included
|
|
directly by the scaffold rather than emitted by the UCE preprocessor.
|
|
|
|
Run on `k-uce`:
|
|
|
|
```bash
|
|
bash spikes/wasm-phase2/build_modules.sh
|
|
bash spikes/wasm-phase2/build_loader.sh
|
|
/tmp/uce/wasm-phase2/loader
|
|
```
|
|
|
|
Expected final line:
|
|
|
|
```text
|
|
PHASE2 EXIT CRITERION: PASS
|
|
```
|
|
|
|
Files:
|
|
|
|
- `core.cpp` — WASM reactor core subset and membrane decode/render entry.
|
|
- `page.uce` — real UCE page statically linked for Phase 2 only.
|
|
- `loader.cpp` — host runner with `uce_host_ctx_read` and `uce_host_log`.
|
|
Its small host-side UCEB1 encoder is spike-only; the production UCE server
|
|
host should use the native `ucb_encode()` implementation to avoid format drift.
|
|
- `build_modules.sh` — wasi-sdk build for `/tmp/uce/wasm-phase2/core.wasm`.
|
|
- `build_loader.sh` — Wasmtime C-API build for `/tmp/uce/wasm-phase2/loader`.
|
|
|
|
Deferred to Phase 3:
|
|
|
|
- PIC side modules and dylink loader integration.
|
|
- Lazy unit/component loading.
|
|
- Full `uce_lib` hostcall surface beyond the minimal context/log membrane.
|
|
- Generator-emitted units (`.uce` preprocessor output with literal markup,
|
|
`__uce_set_current_request`, and generated includes) rendering through this
|
|
membrane; Phase 0 only proved those generated units can compile as side
|
|
modules.
|