Files
rose-ash/shared/static/wasm/sx/bytecode.sxbc.json
giles b274e428eb WASM kernel fixes: parse, env sync, iterative CEK, click delegation
Browser kernel:
- Add `parse` native fn (matches server: unwrap single, list for multiple)
- Restore env==global_env guard on _env_bind_hook (let bindings must not
  leak to _vm_globals — caused JIT CSSX "Not callable: nil" errors)
- Add _env_bind_hook call in env_set_id so set! mutations sync to VM globals
- Fire _vm_global_set_hook from OP_DEFINE so VM defines sync back to CEK env

CEK evaluator:
- Replace recursive cek_run with iterative while loop using sx_truthy
  (previous attempt used strict Bool true matching, broke in wasm_of_ocaml)
- Remove dead cek_run_iterative function

Web modules:
- Remove find-matching-route and parse-route-pattern stubs from
  boot-helpers.sx that shadowed real implementations from router.sx
- Sync boot-helpers.sx to dist/static dirs for bytecode compilation

Platform (sx-platform.js):
- Set data-sx-ready attribute after boot completes (was only in boot-init
  which sx-platform.js doesn't call — it steps through boot manually)
- Add document-level click delegation for a[sx-get] links as workaround
  for bytecoded bind-event not attaching per-element listeners (VM closure
  issue under investigation — bind-event runs but dom-add-listener calls
  don't result in addEventListener)

Tests:
- New test_kernel.js: 24 tests covering env sync, parse, route matching,
  host FFI/preventDefault, deep recursion
- New navigation test: "sx-get link fetches SX not HTML and preserves layout"
  (currently catches layout breakage after SPA swap — known issue)

Known remaining issues:
- JIT CSSX failures: closure-captured variables resolve to nil in VM bytecode
- SPA content swap via execute-request breaks page layout
- Bytecoded bind-event doesn't attach per-element addEventListener (root
  cause unknown — when listen-target guard appears to block despite element
  being valid)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 13:33:13 +00:00

1 line
6.7 KiB
JSON

{"magic":"SXBC","version":1,"hash":"45824e713893dfa0","module":{"bytecode":[1,1,0,128,0,0,5,1,3,0,128,2,0,5,1,5,0,128,4,0,5,1,7,0,128,6,0,5,1,9,0,128,8,0,5,1,11,0,128,10,0,5,1,13,0,128,12,0,5,1,15,0,128,14,0,5,1,17,0,128,16,0,5,1,19,0,128,18,0,5,1,21,0,128,20,0,5,1,23,0,128,22,0,5,1,25,0,128,24,0,5,1,27,0,128,26,0,5,1,29,0,128,28,0,5,1,31,0,128,30,0,5,1,33,0,128,32,0,5,1,35,0,128,34,0,5,1,37,0,128,36,0,5,1,39,0,128,38,0,5,1,41,0,128,40,0,5,1,43,0,128,42,0,5,1,45,0,128,44,0,5,1,47,0,128,46,0,5,1,49,0,128,48,0,5,1,51,0,128,50,0,5,1,53,0,128,52,0,5,1,55,0,128,54,0,5,1,57,0,128,56,0,5,1,59,0,128,58,0,5,1,61,0,128,60,0,5,1,63,0,128,62,0,5,1,65,0,128,64,0,5,1,67,0,128,66,0,5,1,69,0,128,68,0,5,1,71,0,128,70,0,5,1,73,0,128,72,0,5,1,75,0,128,74,0,5,1,77,0,128,76,0,5,1,79,0,128,78,0,5,1,81,0,128,80,0,5,1,83,0,128,82,0,5,1,85,0,128,84,0,5,1,87,0,128,86,0,5,1,89,0,128,88,0,5,1,91,0,128,90,0,5,1,93,0,128,92,0,5,1,95,0,128,94,0,5,1,97,0,128,96,0,5,1,99,0,128,98,0,5,1,101,0,128,100,0,5,1,103,0,128,102,0,5,1,105,0,128,104,0,5,1,107,0,128,106,0,5,1,109,0,128,108,0,5,1,111,0,128,110,0,5,1,113,0,128,112,0,5,1,115,0,128,114,0,5,1,117,0,128,116,0,5,1,119,0,128,118,0,5,1,121,0,128,120,0,5,1,123,0,128,122,0,5,1,125,0,128,124,0,5,1,127,0,128,126,0,5,1,129,0,128,128,0,5,1,131,0,128,130,0,5,1,133,0,128,132,0,5,1,135,0,128,134,0,5,1,137,0,128,136,0,5,1,139,0,128,138,0,5,1,141,0,128,140,0,5,1,143,0,128,142,0,5,1,1,0,128,144,0,5,1,1,0,128,145,0,5,1,3,0,128,146,0,5,1,5,0,128,147,0,5,1,7,0,128,148,0,5,1,9,0,128,149,0,5,1,11,0,128,150,0,5,1,152,0,128,151,0,5,1,154,0,128,153,0,5,1,156,0,128,155,0,5,51,158,0,128,157,0,50],"constants":[{"t":"s","v":"OP_CONST"},{"t":"n","v":1},{"t":"s","v":"OP_NIL"},{"t":"n","v":2},{"t":"s","v":"OP_TRUE"},{"t":"n","v":3},{"t":"s","v":"OP_FALSE"},{"t":"n","v":4},{"t":"s","v":"OP_POP"},{"t":"n","v":5},{"t":"s","v":"OP_DUP"},{"t":"n","v":6},{"t":"s","v":"OP_LOCAL_GET"},{"t":"n","v":16},{"t":"s","v":"OP_LOCAL_SET"},{"t":"n","v":17},{"t":"s","v":"OP_UPVALUE_GET"},{"t":"n","v":18},{"t":"s","v":"OP_UPVALUE_SET"},{"t":"n","v":19},{"t":"s","v":"OP_GLOBAL_GET"},{"t":"n","v":20},{"t":"s","v":"OP_GLOBAL_SET"},{"t":"n","v":21},{"t":"s","v":"OP_JUMP"},{"t":"n","v":32},{"t":"s","v":"OP_JUMP_IF_FALSE"},{"t":"n","v":33},{"t":"s","v":"OP_JUMP_IF_TRUE"},{"t":"n","v":34},{"t":"s","v":"OP_CALL"},{"t":"n","v":48},{"t":"s","v":"OP_TAIL_CALL"},{"t":"n","v":49},{"t":"s","v":"OP_RETURN"},{"t":"n","v":50},{"t":"s","v":"OP_CLOSURE"},{"t":"n","v":51},{"t":"s","v":"OP_CALL_PRIM"},{"t":"n","v":52},{"t":"s","v":"OP_APPLY"},{"t":"n","v":53},{"t":"s","v":"OP_LIST"},{"t":"n","v":64},{"t":"s","v":"OP_DICT"},{"t":"n","v":65},{"t":"s","v":"OP_APPEND_BANG"},{"t":"n","v":66},{"t":"s","v":"OP_ITER_INIT"},{"t":"n","v":80},{"t":"s","v":"OP_ITER_NEXT"},{"t":"n","v":81},{"t":"s","v":"OP_MAP_OPEN"},{"t":"n","v":82},{"t":"s","v":"OP_MAP_APPEND"},{"t":"n","v":83},{"t":"s","v":"OP_MAP_CLOSE"},{"t":"n","v":84},{"t":"s","v":"OP_FILTER_TEST"},{"t":"n","v":85},{"t":"s","v":"OP_HO_MAP"},{"t":"n","v":88},{"t":"s","v":"OP_HO_FILTER"},{"t":"n","v":89},{"t":"s","v":"OP_HO_REDUCE"},{"t":"n","v":90},{"t":"s","v":"OP_HO_FOR_EACH"},{"t":"n","v":91},{"t":"s","v":"OP_HO_SOME"},{"t":"n","v":92},{"t":"s","v":"OP_HO_EVERY"},{"t":"n","v":93},{"t":"s","v":"OP_SCOPE_PUSH"},{"t":"n","v":96},{"t":"s","v":"OP_SCOPE_POP"},{"t":"n","v":97},{"t":"s","v":"OP_PROVIDE_PUSH"},{"t":"n","v":98},{"t":"s","v":"OP_PROVIDE_POP"},{"t":"n","v":99},{"t":"s","v":"OP_CONTEXT"},{"t":"n","v":100},{"t":"s","v":"OP_EMIT"},{"t":"n","v":101},{"t":"s","v":"OP_EMITTED"},{"t":"n","v":102},{"t":"s","v":"OP_RESET"},{"t":"n","v":112},{"t":"s","v":"OP_SHIFT"},{"t":"n","v":113},{"t":"s","v":"OP_DEFINE"},{"t":"n","v":128},{"t":"s","v":"OP_DEFCOMP"},{"t":"n","v":129},{"t":"s","v":"OP_DEFISLAND"},{"t":"n","v":130},{"t":"s","v":"OP_DEFMACRO"},{"t":"n","v":131},{"t":"s","v":"OP_EXPAND_MACRO"},{"t":"n","v":132},{"t":"s","v":"OP_STR_CONCAT"},{"t":"n","v":144},{"t":"s","v":"OP_STR_JOIN"},{"t":"n","v":145},{"t":"s","v":"OP_SERIALIZE"},{"t":"n","v":146},{"t":"s","v":"OP_ADD"},{"t":"n","v":160},{"t":"s","v":"OP_SUB"},{"t":"n","v":161},{"t":"s","v":"OP_MUL"},{"t":"n","v":162},{"t":"s","v":"OP_DIV"},{"t":"n","v":163},{"t":"s","v":"OP_EQ"},{"t":"n","v":164},{"t":"s","v":"OP_LT"},{"t":"n","v":165},{"t":"s","v":"OP_GT"},{"t":"n","v":166},{"t":"s","v":"OP_NOT"},{"t":"n","v":167},{"t":"s","v":"OP_LEN"},{"t":"n","v":168},{"t":"s","v":"OP_FIRST"},{"t":"n","v":169},{"t":"s","v":"OP_REST"},{"t":"n","v":170},{"t":"s","v":"OP_NTH"},{"t":"n","v":171},{"t":"s","v":"OP_CONS"},{"t":"n","v":172},{"t":"s","v":"OP_NEG"},{"t":"n","v":173},{"t":"s","v":"OP_INC"},{"t":"n","v":174},{"t":"s","v":"OP_DEC"},{"t":"n","v":175},{"t":"s","v":"OP_ASER_TAG"},{"t":"n","v":224},{"t":"s","v":"OP_ASER_FRAG"},{"t":"n","v":225},{"t":"s","v":"BYTECODE_MAGIC"},{"t":"s","v":"SXBC"},{"t":"s","v":"BYTECODE_VERSION"},{"t":"s","v":"CONST_NUMBER"},{"t":"s","v":"CONST_STRING"},{"t":"s","v":"CONST_BOOL"},{"t":"s","v":"CONST_NIL"},{"t":"s","v":"CONST_SYMBOL"},{"t":"s","v":"CONST_KEYWORD"},{"t":"s","v":"CONST_LIST"},{"t":"n","v":7},{"t":"s","v":"CONST_DICT"},{"t":"n","v":8},{"t":"s","v":"CONST_CODE"},{"t":"n","v":9},{"t":"s","v":"opcode-name"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,33,6,0,1,2,0,32,59,1,16,0,1,3,0,52,0,0,2,33,6,0,1,4,0,32,41,1,16,0,1,5,0,52,0,0,2,33,6,0,1,6,0,32,23,1,16,0,1,7,0,52,0,0,2,33,6,0,1,8,0,32,5,1,16,0,1,9,0,52,0,0,2,33,6,0,1,10,0,32,243,0,16,0,1,11,0,52,0,0,2,33,6,0,1,12,0,32,225,0,16,0,1,13,0,52,0,0,2,33,6,0,1,14,0,32,207,0,16,0,1,15,0,52,0,0,2,33,6,0,1,16,0,32,189,0,16,0,1,17,0,52,0,0,2,33,6,0,1,18,0,32,171,0,16,0,1,19,0,52,0,0,2,33,6,0,1,20,0,32,153,0,16,0,1,21,0,52,0,0,2,33,6,0,1,22,0,32,135,0,16,0,1,23,0,52,0,0,2,33,6,0,1,24,0,32,117,0,16,0,1,25,0,52,0,0,2,33,6,0,1,26,0,32,99,0,16,0,1,27,0,52,0,0,2,33,6,0,1,28,0,32,81,0,16,0,1,29,0,52,0,0,2,33,6,0,1,30,0,32,63,0,16,0,1,31,0,52,0,0,2,33,6,0,1,32,0,32,45,0,16,0,1,33,0,52,0,0,2,33,6,0,1,34,0,32,27,0,16,0,1,35,0,52,0,0,2,33,6,0,1,36,0,32,9,0,1,38,0,16,0,52,37,0,2,50],"constants":[{"t":"s","v":"="},{"t":"n","v":1},{"t":"s","v":"CONST"},{"t":"n","v":2},{"t":"s","v":"NIL"},{"t":"n","v":3},{"t":"s","v":"TRUE"},{"t":"n","v":4},{"t":"s","v":"FALSE"},{"t":"n","v":5},{"t":"s","v":"POP"},{"t":"n","v":6},{"t":"s","v":"DUP"},{"t":"n","v":16},{"t":"s","v":"LOCAL_GET"},{"t":"n","v":17},{"t":"s","v":"LOCAL_SET"},{"t":"n","v":20},{"t":"s","v":"GLOBAL_GET"},{"t":"n","v":21},{"t":"s","v":"GLOBAL_SET"},{"t":"n","v":32},{"t":"s","v":"JUMP"},{"t":"n","v":33},{"t":"s","v":"JUMP_IF_FALSE"},{"t":"n","v":48},{"t":"s","v":"CALL"},{"t":"n","v":49},{"t":"s","v":"TAIL_CALL"},{"t":"n","v":50},{"t":"s","v":"RETURN"},{"t":"n","v":52},{"t":"s","v":"CALL_PRIM"},{"t":"n","v":128},{"t":"s","v":"DEFINE"},{"t":"n","v":144},{"t":"s","v":"STR_CONCAT"},{"t":"s","v":"str"},{"t":"s","v":"OP_"}],"arity":1}}]}}