kernel+bundle: fix nil-bytecode .sxbc (compile-blob serializer dropped Integer)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s

Every .sxbc shipped with `:bytecode (nil nil ...)` and `:arity nil`, so the WASM
kernel's vm.sx hit "VM: unknown opcode 0" on every module and fell back to .sx
source (slower, noisy console). Root cause: `raw_serialize` in the `compile-blob`
command (sx_server.ml) handles `Number` but not `Integer`, and bytecode opcodes +
arity/upvalue-count are `Integer`s — so they fell through to the `_ -> "nil"`
catch-all and serialized as nil. Same class of bug as the value_to_js Integer gap
(689dae7d). It went unnoticed because source-fallback masks it. Add the Integer
case and regenerate: the web stack now loads entirely from bytecode (0 unknown-
opcode warnings, 0 source fallbacks), boost + SPA unchanged. compiler.sx in the
bundle was also stale — re-synced to the canonical lib/compiler.sx.

Verified: native host conformance 271/271; chromium boots with 0 unknown-opcode
warnings + 0 source-fallback loads; spa-check still passes (boost 6/6, fragment
swap). Prereq for content-addressing the assets (caching real bytecode, not nil).
This commit is contained in:
2026-06-29 13:17:20 +00:00
parent 41f3e9b276
commit 59ac51a8ba
37 changed files with 65 additions and 57 deletions

View File

@@ -1,3 +1,3 @@
(sxbc 1 "232c1519553b1d5f"
(code
:constants ("with-marsh-scope" {:upvalue-count nil :arity nil :constants ("list" "with-island-scope" {:upvalue-count nil :arity nil :constants ("append!") :bytecode (nil nil nil nil nil nil nil nil nil)} "dom-set-data" "sx-marsh-disposers") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)} "dispose-marsh-scope" {:upvalue-count nil :arity nil :constants ("dom-get-data" "sx-marsh-disposers" "for-each" {:upvalue-count nil :arity nil :constants ("cek-call") :bytecode (nil nil nil nil nil nil nil nil)} "dom-set-data") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)} "emit-event" {:upvalue-count nil :arity nil :constants ("dom-dispatch") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil)} "on-event" {:upvalue-count nil :arity nil :constants ("dom-on") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil)} "bridge-event" {:upvalue-count nil :arity nil :constants ("effect" {:upvalue-count nil :arity nil :constants ("dom-on" {:upvalue-count nil :arity nil :constants ("event-detail" "cek-call" "list" "reset!") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)}) :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)}) :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)} "resource" {:upvalue-count nil :arity nil :constants ("signal" "dict" "loading" "data" "error" "promise-then" "cek-call" {:upvalue-count nil :arity nil :constants ("reset!" "dict" "loading" "data" "error") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)} {:upvalue-count nil :arity nil :constants ("reset!" "dict" "loading" "data" "error") :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)}) :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)} {:library (sx signals-web) :op "import"}) :bytecode (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)))
:constants ("with-marsh-scope" {:upvalue-count 0 :arity 2 :constants ("list" "with-island-scope" {:upvalue-count 1 :arity 1 :constants ("append!") :bytecode (18 0 16 0 52 0 0 2 50)} "dom-set-data" "sx-marsh-disposers") :bytecode (52 0 0 0 17 2 20 1 0 51 2 0 1 2 16 1 48 2 5 20 3 0 16 0 1 4 0 16 2 49 3 50)} "dispose-marsh-scope" {:upvalue-count 0 :arity 1 :constants ("dom-get-data" "sx-marsh-disposers" {:upvalue-count 0 :arity 1 :constants ("cek-call") :bytecode (16 0 2 52 0 0 2 50)} "for-each" "dom-set-data") :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 16 1 33 24 0 51 2 0 16 1 52 3 0 2 5 20 4 0 16 0 1 1 0 2 49 3 32 1 0 2 50)} "emit-event" {:upvalue-count 0 :arity 3 :constants ("dom-dispatch") :bytecode (20 0 0 16 0 16 1 16 2 49 3 50)} "on-event" {:upvalue-count 0 :arity 3 :constants ("dom-on") :bytecode (20 0 0 16 0 16 1 16 2 49 3 50)} "bridge-event" {:upvalue-count 0 :arity 4 :constants ("effect" {:upvalue-count 4 :arity 0 :constants ("dom-on" {:upvalue-count 2 :arity 1 :constants ("event-detail" "list" "cek-call" "reset!") :bytecode (20 0 0 16 0 48 1 17 1 18 0 33 15 0 18 0 16 1 52 1 0 1 52 2 0 2 32 2 0 16 1 17 2 20 3 0 18 1 16 2 49 2 50)}) :bytecode (20 0 0 18 0 18 1 51 1 0 0 2 0 3 48 3 17 0 16 0 50)}) :bytecode (20 0 0 51 1 0 1 0 1 1 1 3 1 2 49 1 50)} "resource" {:upvalue-count 0 :arity 1 :constants ("signal" "loading" "data" "error" "dict" "promise-then" "cek-call" {:upvalue-count 1 :arity 1 :constants ("reset!" "loading" "data" "error" "dict") :bytecode (20 0 0 18 0 1 1 0 4 1 2 0 16 0 1 3 0 2 52 4 0 6 49 2 50)} {:upvalue-count 1 :arity 1 :constants ("reset!" "loading" "data" "error" "dict") :bytecode (20 0 0 18 0 1 1 0 4 1 2 0 2 1 3 0 16 0 52 4 0 6 49 2 50)}) :bytecode (20 0 0 1 1 0 3 1 2 0 2 1 3 0 2 52 4 0 6 48 1 17 1 20 5 0 16 0 2 52 6 0 2 51 7 0 1 1 51 8 0 1 1 48 3 5 16 1 50)} {:library (sx signals-web) :op "import"}) :bytecode (51 1 0 128 0 0 5 51 3 0 128 2 0 5 51 5 0 128 4 0 5 51 7 0 128 6 0 5 51 9 0 128 8 0 5 51 11 0 128 10 0 5 1 12 0 112 50)))