Sigil 0.23.0
A memory and runtime release. Native and C-to-WebAssembly programs use less memory, idle programs wake less often, and a full Unix socket queue no longer stalls other fibers.
Owned allocator
Static Linux x86_64 programs, including the shipped sigil command, and C-to-WebAssembly builds using Zig's WASI target now use mimalloc 3.5.3. In a fixed 18-minute room tour with the same Harkfell build, the owned allocator cut peak WebAssembly memory by about 213 MiB (31%).
Other targets keep their current allocator. To keep the stock allocator, add allocator-stock to your build config's features. allocator-mimalloc requests mimalloc explicitly and fails on an unsupported target. The first build after upgrading rebuilds the allocator because its identity is now part of the build cache.
The sigil-allocator query from (sigil meta) reports the running program's allocator. Native and WASI builds also write that identity in an .allocator file beside the output. See the allocator guide for configuration.
Native clock units
Native current-jiffy now counts microseconds, with 1,000,000 jiffies per second. Previously, the Unix clock could overflow the small-integer range after about 39 hours of machine uptime. The clock now stays exact, using a large integer when needed. Use (jiffies-per-second) to convert ticks to seconds instead of assuming a fixed rate.
Fixes
- Idle POSIX programs waiting on sockets, signals or timers woke every 100 ms even when nothing needed attention. They now sleep until activity or the next deadline.
- Connecting to a Unix socket with a full queue could block the whole cooperative VM.
unix-connectnow parks only the caller and accepts atimeout-ms:deadline, closing unfinished sockets on timeout or exception. - Native
with-asynccould return while external work was still pending. It now waits for that work to finish. - Direct-WASM builds could reject module initializers whose branches returned a mix of Boolean and numeric values. Those initializers now compile.
- Repeated imports could exhaust a module's import records, and imports beyond the limit could go unrecorded. Equivalent imports now reuse records; more than 128 distinct imports raises an error naming the module and import, both when loading in the VM and when compiling.
- Direct-WASM builds carried redundant copies and repeated cleanup code. Measured Crash The Stack and Harkfell builds are now about 21% smaller uncompressed, including their runtime companion.
- Direct-WASM calls could miss updated bindings or providers registered after the first lookup. Calls now see those changes.
- Valid library graphs could be rejected because provider selection used the wrong identity. Selection now uses the chosen provider's identity.
- Supported UI calls in Direct-WASM builds could fail with a missing native-leaf error. Those calls now compile.
- Repeatedly adding the same library search directory could exhaust the 128-path limit. Adding it again now moves it to the front without consuming another slot.
- Browser initialization could fail to resolve native bridge calls. Those calls now resolve through their module bindings.
- Ordinary web apps could require a separate Direct-WASM host at startup. They no longer export the companion-only entry points that caused it.
- A bytecode
guardcould leave the VM in a broken return state when a native callback raised an error. It now catches the error and resumes its handler. - Identical WebAssembly runtime companion builds could produce different bytes in different directories. Their output now matches.
- Release downloads containing allocator sidecars could be rejected by the old verifier. Verification now derives the expected files from the checksum manifest and checks each binary's allocator identity.