4.5 KiB
4.5 KiB
Changelog
All notable changes to WAFER are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.0 - 2026-08-06
The usability release: introspection, source files, honest errors, and a safety net under every compiled word.
Added
- Stack guards in compiled code: under/overflow checks at the
stack-pointer choke points of generated WASM. Faults THROW standard codes
(
-3..-6,-44,-45), are CATCHable, and print standard messages instead of silently corrupting memory. Default on;wafer buildoutput stays unguarded;WAFER_STACK_GUARDS=0|1overrides. SEE: source-level decompiler. Colon words (including everything inboot.fth) show their captured verbatim source; data words show synthesized definitions with current values (9 VALUE X,DEFER D ( IS DUP )); primitives fall back to a readable IR dump —SEEnever dead-ends on a defined word.SEE-IR: post-optimization IR view with resolved callee names and indented control flow — shows what the optimizer actually did.HELP: stack effect + one-line description for every word in a fresh VM (dictionary words and outer-interpreter tokens alike); coverage is enforced by a unit test, so an undocumented new word fails the build. User words echo their leading( n -- n )comment.INCLUDE/INCLUDED: nestable source-file loading with cycle detection, depth bound, paths relative to the including file, and per-levelSOURCE-ID. The loader is injected (CLI: filesystem; web: defined error), so the core stays IO-free.wafer prog.fthnow runs through the same machinery.MARKERextensions:REMEMBER(re-runnable marker),EMPTYandGILD(boot-state rollback and re-baselining). Marker rollback now also restores search order, wordlists,REPLACESsubstitutions,ABORT"texts, and captured word sources — enabling theREMEMBER+INCLUDEedit-reload loop.WORDS: optional substring filter (WORDS FLOAT), word count, andWORDS ALL— a grouped full view by wordlist plus internal words.- Return-stack introspection:
.RS,RDEPTH,RP@. - Tools:
.ShonorsBASE,F.S,?, bounds-checkedDUMP, realBYE, namedORDERoutput. - CLI REPL: persistent history (XDG state dir,
0600), dictionary-backed tab completion, prefix history search on Up/Down, Ctrl-C clears the line. - Web REPL: history persisted to localStorage, User Words palette,
BASEindicator in the stack bar. - Error reporting: uncaught
THROWcodes map to standard messages;ABORT"text prints only when uncaught; errors inside included files carryfile.fth:line:context; uncaught throws are typed (WaferError::UncaughtThrow) for embedding consumers; compiled words carry WASM name sections, so genuine traps name the faulting word (in CRASHER: wasm trap: out of bounds memory access). - SwiftForth correctness lane: the cross-engine program corpus can run
against sf64 as an oracle (
just compare-correctness), alongside the existing gforth lane and the sf64 performance lane.
Fixed
- Multi-line command output in the CLI REPL starts on its own line
(inline
okecho only for single-line output). .Sprinted in decimal regardless ofBASE.- A bare interpreted
R>underflowed silently (exposed by the new stack guards; compliance baseline updated). SPACESwith a negative count now outputs nothing, per Forth 2012 6.1.2230.
Changed
wafer prog.fthreports errors withfile:linecontext and resolves nestedINCLUDEs relative to the file.- Internal words (
_-prefixed) are flagged in the dictionary and hidden fromWORDSand completion (WORDS ALLshows them). - Dependencies upgraded across the board: wasmtime 43 → 47, wasm-encoder/wasmparser 0.246 → 0.255, plus all semver-compatible updates.
0.1.0 - 2026-08-04
Initial development line (untagged): Forth 2012 core with IR optimizer and
WASM codegen via wasm-encoder/wasmtime, ~300 words across Core, Double,
Float, String, Search-Order, Exception, and Tools word sets, Forth 2012
compliance suite, CONSOLIDATE whole-program recompilation, wafer build
AOT export (WASM / native / JS loader), browser REPL, SHA-1/256/512 words,
and cross-engine benchmark lanes against gforth and SwiftForth.