The sx-get links were doing full page refreshes because click handlers never attached. Root causes: VM frame management bug, missing primitives, CEK/VM type dispatch mismatch, and silent error swallowing. Fixes: - VM frame exhaustion: frames <- [] now properly pops to rest_frames - length primitive: add alias for len in OCaml primitives - call_sx_fn: use sx_call directly instead of eval_expr (CEK checks for type "lambda" but VmClosure reports "function") - Boot error surfacing: Sx.init() now has try/catch + failure summary - Callback error surfacing: catch-all handler for non-Eval_error exceptions - Silent JIT failures: log before CEK fallback instead of swallowing - vm→env sync: loadModule now calls sync_vm_to_env() - sx_build_bytecode MCP tool added for bytecode compilation Tests: 50 new tests across test-vm.sx and test-vm-primitives.sx covering nested VM calls, frame integrity, CEK bridge, primitive availability, cross-module symbol resolution, and callback dispatch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 line
13 KiB
JSON
1 line
13 KiB
JSON
{"magic":"SXBC","version":1,"hash":"352dd0823915cc55","module":{"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,51,13,0,128,12,0,5,51,15,0,128,14,0,5,51,17,0,128,16,0,5,51,19,0,128,18,0,5,51,21,0,128,20,0,5,51,23,0,128,22,0,5,51,25,0,128,24,0,50],"constants":[{"t":"s","v":"hsx-indent"},{"t":"code","v":{"bytecode":[1,0,0,17,1,51,2,0,1,1,1,4,0,16,0,52,3,0,2,52,1,0,2,5,16,1,50],"constants":[{"t":"s","v":""},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[18,0,1,1,0,52,0,0,2,19,0,50],"constants":[{"t":"s","v":"str"},{"t":"s","v":" "}],"arity":1,"upvalue-count":1}},{"t":"s","v":"range"},{"t":"n","v":0}],"arity":1}},{"t":"s","v":"hsx-sym-name"},{"t":"code","v":{"bytecode":[16,0,52,1,0,1,1,2,0,52,0,0,2,33,10,0,20,3,0,16,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"}],"arity":1}},{"t":"s","v":"hsx-kw-name"},{"t":"code","v":{"bytecode":[16,0,52,1,0,1,1,2,0,52,0,0,2,33,10,0,20,3,0,16,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"keyword-name"}],"arity":1}},{"t":"s","v":"hsx-is-element?"},{"t":"code","v":{"bytecode":[16,0,6,33,26,0,5,16,0,1,2,0,52,1,0,2,52,0,0,1,6,33,8,0,5,20,3,0,16,0,49,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"starts-with?"},{"t":"s","v":"~"},{"t":"s","v":"is-html-tag?"}],"arity":1}},{"t":"s","v":"hsx-is-component?"},{"t":"code","v":{"bytecode":[16,0,6,33,10,0,5,16,0,1,1,0,52,0,0,2,50],"constants":[{"t":"s","v":"starts-with?"},{"t":"s","v":"~"}],"arity":1}},{"t":"s","v":"hsx-extract-css"},{"t":"code","v":{"bytecode":[2,17,1,2,17,2,52,0,0,0,17,3,1,1,0,17,4,16,0,52,2,0,1,17,5,2,17,6,51,3,0,1,4,1,5,1,0,1,1,1,6,1,2,1,3,17,6,16,6,48,0,5,1,5,0,16,1,1,6,0,16,2,1,7,0,16,3,1,8,0,16,4,16,5,52,9,0,2,33,11,0,16,0,16,4,52,10,0,2,32,4,0,52,0,0,0,52,4,0,8,50],"constants":[{"t":"s","v":"list"},{"t":"n","v":0},{"t":"s","v":"len"},{"t":"code","v":{"bytecode":[18,0,18,1,52,0,0,2,33,180,0,20,1,0,18,2,18,0,52,2,0,2,48,1,17,0,16,0,1,4,0,52,3,0,2,33,37,0,18,2,18,0,1,6,0,52,5,0,2,52,2,0,2,19,3,5,18,0,1,7,0,52,5,0,2,19,0,5,18,4,49,0,32,113,0,16,0,1,8,0,52,3,0,2,33,37,0,18,2,18,0,1,6,0,52,5,0,2,52,2,0,2,19,5,5,18,0,1,7,0,52,5,0,2,19,0,5,18,4,49,0,32,64,0,16,0,33,58,0,20,9,0,18,6,18,2,18,0,52,2,0,2,48,2,5,20,9,0,18,6,18,2,18,0,1,6,0,52,5,0,2,52,2,0,2,48,2,5,18,0,1,7,0,52,5,0,2,19,0,5,18,4,49,0,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"<"},{"t":"s","v":"hsx-kw-name"},{"t":"s","v":"nth"},{"t":"s","v":"="},{"t":"s","v":"class"},{"t":"s","v":"+"},{"t":"n","v":1},{"t":"n","v":2},{"t":"s","v":"id"},{"t":"s","v":"append!"}],"upvalue-count":7}},{"t":"s","v":"dict"},{"t":"s","v":"classes"},{"t":"s","v":"id"},{"t":"s","v":"attrs"},{"t":"s","v":"children"},{"t":"s","v":"<"},{"t":"s","v":"slice"}],"arity":1}},{"t":"s","v":"hsx-tag-str"},{"t":"code","v":{"bytecode":[16,0,17,2,16,1,1,1,0,52,0,0,2,17,3,16,1,1,2,0,52,0,0,2,17,4,16,3,6,33,7,0,5,16,3,52,3,0,1,33,21,0,51,5,0,1,2,16,3,1,7,0,52,6,0,2,52,4,0,2,32,1,0,2,5,16,4,33,16,0,16,2,1,9,0,16,4,52,8,0,3,17,2,32,1,0,2,5,16,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"classes"},{"t":"s","v":"id"},{"t":"s","v":"string?"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[18,0,1,1,0,16,0,52,0,0,3,19,0,50],"constants":[{"t":"s","v":"str"},{"t":"s","v":"."}],"arity":1,"upvalue-count":1}},{"t":"s","v":"split"},{"t":"s","v":" "},{"t":"s","v":"str"},{"t":"s","v":"#"}],"arity":2}},{"t":"s","v":"hsx-atom"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,6,0,1,1,0,32,151,0,16,0,52,2,0,1,33,15,0,1,4,0,16,0,1,4,0,52,3,0,3,32,127,0,16,0,52,5,0,1,33,9,0,16,0,52,3,0,1,32,109,0,16,0,52,7,0,1,1,8,0,52,6,0,2,33,17,0,16,0,33,6,0,1,9,0,32,3,0,1,10,0,32,76,0,16,0,52,7,0,1,1,11,0,52,6,0,2,33,20,0,1,12,0,20,13,0,16,0,48,1,1,14,0,52,3,0,3,32,40,0,16,0,52,7,0,1,1,15,0,52,6,0,2,33,17,0,1,16,0,20,17,0,16,0,48,1,52,3,0,2,32,7,0,20,18,0,16,0,49,1,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"nil"},{"t":"s","v":"string?"},{"t":"s","v":"str"},{"t":"s","v":"\""},{"t":"s","v":"number?"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"boolean"},{"t":"s","v":"true"},{"t":"s","v":"false"},{"t":"s","v":"symbol"},{"t":"s","v":"{"},{"t":"s","v":"symbol-name"},{"t":"s","v":"}"},{"t":"s","v":"keyword"},{"t":"s","v":":"},{"t":"s","v":"keyword-name"},{"t":"s","v":"sx-serialize"}],"arity":1}},{"t":"s","v":"hsx-inline"},{"t":"code","v":{"bytecode":[16,0,52,1,0,1,52,0,0,1,33,10,0,20,2,0,16,0,49,1,32,84,1,16,0,52,3,0,1,33,6,0,1,4,0,32,69,1,20,5,0,16,0,52,6,0,1,48,1,17,1,16,1,1,8,0,52,7,0,2,33,24,0,1,10,0,20,2,0,16,0,1,12,0,52,11,0,2,48,1,52,9,0,2,32,20,1,16,1,1,13,0,52,7,0,2,33,49,0,1,14,0,16,0,52,16,0,1,1,12,0,52,15,0,2,33,17,0,20,17,0,16,0,1,12,0,52,11,0,2,48,1,32,3,0,1,18,0,1,19,0,52,9,0,3,32,215,0,16,1,1,20,0,52,7,0,2,33,38,0,20,2,0,16,0,1,12,0,52,11,0,2,48,1,1,21,0,20,17,0,16,0,1,22,0,52,11,0,2,48,1,52,9,0,3,32,165,0,16,1,1,23,0,52,7,0,2,33,38,0,20,2,0,16,0,1,12,0,52,11,0,2,48,1,1,24,0,20,17,0,16,0,1,22,0,52,11,0,2,48,1,52,9,0,3,32,115,0,16,1,1,9,0,52,7,0,2,33,33,0,1,25,0,1,18,0,51,28,0,16,0,52,29,0,1,52,27,0,2,52,26,0,2,1,25,0,52,9,0,3,32,70,0,1,30,0,20,2,0,16,0,52,6,0,1,48,1,16,0,52,16,0,1,1,12,0,52,15,0,2,33,30,0,1,31,0,1,31,0,20,17,0,16,0,52,29,0,1,52,27,0,2,52,26,0,2,52,9,0,2,32,3,0,1,18,0,1,19,0,52,9,0,4,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"list?"},{"t":"s","v":"sx-serialize"},{"t":"s","v":"empty?"},{"t":"s","v":"()"},{"t":"s","v":"hsx-sym-name"},{"t":"s","v":"first"},{"t":"s","v":"="},{"t":"s","v":"deref"},{"t":"s","v":"str"},{"t":"s","v":"@"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"s","v":"signal"},{"t":"s","v":"signal("},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"s","v":"hsx-inline"},{"t":"s","v":""},{"t":"s","v":")"},{"t":"s","v":"reset!"},{"t":"s","v":" := "},{"t":"n","v":2},{"t":"s","v":"swap!"},{"t":"s","v":" <- "},{"t":"s","v":"\""},{"t":"s","v":"join"},{"t":"s","v":"map"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,5,0,16,0,32,17,0,1,2,0,20,3,0,16,0,48,1,1,4,0,52,1,0,3,50],"constants":[{"t":"s","v":"string?"},{"t":"s","v":"str"},{"t":"s","v":"{"},{"t":"s","v":"hsx-inline"},{"t":"s","v":"}"}],"arity":1}},{"t":"s","v":"rest"},{"t":"s","v":"("},{"t":"s","v":" "}],"arity":1}},{"t":"s","v":"hsx-attrs-str"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,6,0,1,1,0,32,48,0,52,2,0,0,17,1,1,3,0,17,2,2,17,3,51,4,0,1,2,1,0,1,1,1,3,17,3,16,3,48,0,5,1,6,0,1,6,0,16,1,52,7,0,2,52,5,0,2,50],"constants":[{"t":"s","v":"empty?"},{"t":"s","v":""},{"t":"s","v":"list"},{"t":"n","v":0},{"t":"code","v":{"bytecode":[18,0,18,1,52,1,0,1,52,0,0,2,33,70,0,20,2,0,18,2,1,4,0,20,5,0,18,1,18,0,52,6,0,2,48,1,1,7,0,20,8,0,18,1,18,0,1,10,0,52,9,0,2,52,6,0,2,48,1,52,3,0,4,48,2,5,18,0,1,11,0,52,9,0,2,19,0,5,18,3,49,0,32,1,0,2,50],"constants":[{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"append!"},{"t":"s","v":"str"},{"t":"s","v":":"},{"t":"s","v":"keyword-name"},{"t":"s","v":"nth"},{"t":"s","v":" "},{"t":"s","v":"hsx-atom"},{"t":"s","v":"+"},{"t":"n","v":1},{"t":"n","v":2}],"upvalue-count":4}},{"t":"s","v":"str"},{"t":"s","v":" "},{"t":"s","v":"join"}],"arity":1}},{"t":"s","v":"hsx-children"},{"t":"code","v":{"bytecode":[16,1,52,0,0,1,33,5,0,16,0,32,85,0,16,1,52,2,0,1,1,3,0,52,1,0,2,6,33,15,0,5,16,1,52,6,0,1,52,5,0,1,52,4,0,1,33,23,0,16,0,1,8,0,20,9,0,16,1,52,6,0,1,48,1,52,7,0,3,32,27,0,16,0,1,10,0,1,10,0,51,13,0,1,2,16,1,52,12,0,2,52,11,0,2,52,7,0,3,50],"constants":[{"t":"s","v":"empty?"},{"t":"s","v":"="},{"t":"s","v":"len"},{"t":"n","v":1},{"t":"s","v":"not"},{"t":"s","v":"list?"},{"t":"s","v":"first"},{"t":"s","v":"str"},{"t":"s","v":" "},{"t":"s","v":"hsx-atom"},{"t":"s","v":"\n"},{"t":"s","v":"join"},{"t":"s","v":"map"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,1,2,0,52,1,0,2,49,2,50],"constants":[{"t":"s","v":"sx->hypersx-node"},{"t":"s","v":"+"},{"t":"n","v":1}],"arity":1,"upvalue-count":1}}],"arity":3}},{"t":"s","v":"sx->hypersx-node"},{"t":"code","v":{"bytecode":[20,0,0,16,1,48,1,17,2,16,0,52,1,0,1,33,12,0,16,2,1,3,0,52,2,0,2,32,201,4,16,0,52,5,0,1,52,4,0,1,33,16,0,16,2,20,6,0,16,0,48,1,52,2,0,2,32,172,4,16,0,52,7,0,1,33,12,0,16,2,1,8,0,52,2,0,2,32,151,4,20,9,0,16,0,52,10,0,1,48,1,17,3,16,3,1,2,0,52,11,0,2,33,16,0,16,2,20,12,0,16,0,48,1,52,2,0,2,32,110,4,16,3,1,13,0,52,11,0,2,33,16,0,16,2,20,12,0,16,0,48,1,52,2,0,2,32,82,4,16,3,1,14,0,52,11,0,2,33,16,0,16,2,20,12,0,16,0,48,1,52,2,0,2,32,54,4,16,3,1,15,0,52,11,0,2,33,16,0,16,2,20,12,0,16,0,48,1,52,2,0,2,32,26,4,16,3,1,16,0,52,11,0,2,33,16,0,16,2,20,12,0,16,0,48,1,52,2,0,2,32,254,3,16,3,1,17,0,52,11,0,2,6,34,10,0,5,16,3,1,18,0,52,11,0,2,33,68,0,16,2,16,3,1,19,0,20,20,0,16,0,1,22,0,52,21,0,2,48,1,1,19,0,20,20,0,16,0,1,23,0,52,21,0,2,48,1,1,24,0,20,25,0,16,0,52,26,0,1,16,1,1,22,0,52,27,0,2,48,2,52,2,0,8,32,160,3,16,3,1,28,0,52,11,0,2,33,54,0,16,2,1,29,0,20,12,0,16,0,1,22,0,52,21,0,2,48,1,1,24,0,1,24,0,51,32,0,1,1,16,0,1,23,0,52,33,0,2,52,31,0,2,52,30,0,2,52,2,0,5,32,94,3,16,3,1,34,0,52,11,0,2,33,223,0,16,0,1,22,0,52,21,0,2,17,4,16,0,1,23,0,52,21,0,2,17,5,16,0,52,36,0,1,1,37,0,52,35,0,2,33,12,0,16,0,1,37,0,52,21,0,2,32,1,0,2,17,6,16,5,52,5,0,1,52,4,0,1,6,33,22,0,5,16,6,52,1,0,1,6,34,11,0,5,16,6,52,5,0,1,52,4,0,1,33,54,0,16,2,1,38,0,20,12,0,16,4,48,1,1,19,0,20,6,0,16,5,48,1,16,6,33,17,0,1,19,0,20,6,0,16,6,48,1,52,2,0,2,32,3,0,1,39,0,52,2,0,6,32,74,0,16,2,1,38,0,20,12,0,16,4,48,1,1,24,0,20,25,0,16,5,16,1,1,22,0,52,27,0,2,48,2,16,6,33,31,0,1,24,0,16,2,1,40,0,20,25,0,16,6,16,1,1,22,0,52,27,0,2,48,2,52,2,0,4,32,3,0,1,39,0,52,2,0,6,32,115,2,16,3,1,41,0,52,11,0,2,6,34,24,0,5,16,3,1,42,0,52,11,0,2,6,34,10,0,5,16,3,1,43,0,52,11,0,2,33,121,0,16,0,1,22,0,52,21,0,2,17,4,16,0,1,23,0,52,33,0,2,17,5,16,2,16,3,1,19,0,1,44,0,51,45,0,16,4,52,5,0,1,6,33,26,0,5,16,4,52,7,0,1,52,4,0,1,6,33,11,0,5,16,4,52,10,0,1,52,5,0,1,33,5,0,16,4,32,6,0,16,4,52,46,0,1,52,31,0,2,52,30,0,2,1,24,0,1,24,0,51,32,0,1,1,16,5,52,31,0,2,52,30,0,2,52,2,0,6,32,210,1,16,3,1,31,0,52,11,0,2,6,33,62,0,5,16,0,52,36,0,1,1,37,0,52,11,0,2,6,33,44,0,5,16,0,1,22,0,52,21,0,2,52,5,0,1,6,33,26,0,5,20,9,0,16,0,1,22,0,52,21,0,2,52,10,0,1,48,1,1,47,0,52,11,0,2,33,81,0,16,0,1,22,0,52,21,0,2,17,4,16,0,1,23,0,52,21,0,2,17,5,16,2,1,48,0,20,12,0,16,5,48,1,1,49,0,20,20,0,16,4,1,22,0,52,21,0,2,48,1,1,24,0,20,25,0,16,4,52,26,0,1,16,1,1,22,0,52,27,0,2,48,2,52,2,0,7,32,51,1,16,3,1,50,0,52,11,0,2,6,33,62,0,5,16,0,52,36,0,1,1,37,0,52,11,0,2,6,33,44,0,5,16,0,1,22,0,52,21,0,2,52,5,0,1,6,33,26,0,5,20,9,0,16,0,1,22,0,52,21,0,2,52,10,0,1,48,1,1,47,0,52,11,0,2,33,81,0,16,0,1,22,0,52,21,0,2,17,4,16,0,1,23,0,52,21,0,2,17,5,16,2,1,51,0,20,20,0,16,4,1,22,0,52,21,0,2,48,1,1,52,0,20,12,0,16,5,48,1,1,24,0,20,25,0,16,4,52,26,0,1,16,1,1,22,0,52,27,0,2,48,2,52,2,0,7,32,148,0,20,53,0,16,3,48,1,33,61,0,20,54,0,16,0,52,55,0,1,48,1,17,4,20,56,0,16,2,20,57,0,16,3,16,4,48,2,20,58,0,16,4,1,60,0,52,59,0,2,48,1,52,2,0,3,16,4,1,61,0,52,59,0,2,16,1,49,3,32,77,0,20,62,0,16,3,48,1,33,54,0,20,54,0,16,0,52,55,0,1,48,1,17,4,20,56,0,16,2,16,3,20,58,0,16,4,1,60,0,52,59,0,2,48,1,52,2,0,3,16,4,1,61,0,52,59,0,2,16,1,49,3,32,13,0,16,2,20,20,0,16,0,48,1,52,2,0,2,50],"constants":[{"t":"s","v":"hsx-indent"},{"t":"s","v":"nil?"},{"t":"s","v":"str"},{"t":"s","v":"nil"},{"t":"s","v":"not"},{"t":"s","v":"list?"},{"t":"s","v":"hsx-atom"},{"t":"s","v":"empty?"},{"t":"s","v":"()"},{"t":"s","v":"hsx-sym-name"},{"t":"s","v":"first"},{"t":"s","v":"="},{"t":"s","v":"hsx-inline"},{"t":"s","v":"deref"},{"t":"s","v":"reset!"},{"t":"s","v":"swap!"},{"t":"s","v":"signal"},{"t":"s","v":"defcomp"},{"t":"s","v":"defisland"},{"t":"s","v":" "},{"t":"s","v":"sx-serialize"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"n","v":2},{"t":"s","v":"\n"},{"t":"s","v":"sx->hypersx-node"},{"t":"s","v":"last"},{"t":"s","v":"+"},{"t":"s","v":"when"},{"t":"s","v":"when "},{"t":"s","v":"join"},{"t":"s","v":"map"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,1,2,0,52,1,0,2,49,2,50],"constants":[{"t":"s","v":"sx->hypersx-node"},{"t":"s","v":"+"},{"t":"n","v":1}],"arity":1,"upvalue-count":1}},{"t":"s","v":"slice"},{"t":"s","v":"if"},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"n","v":3},{"t":"s","v":"if "},{"t":"s","v":""},{"t":"s","v":"else\n"},{"t":"s","v":"let"},{"t":"s","v":"letrec"},{"t":"s","v":"let*"},{"t":"s","v":", "},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,6,33,14,0,5,16,0,52,2,0,1,1,3,0,52,1,0,2,33,35,0,20,5,0,16,0,52,6,0,1,48,1,1,7,0,20,8,0,16,0,1,10,0,52,9,0,2,48,1,52,4,0,3,32,7,0,20,5,0,16,0,49,1,50],"constants":[{"t":"s","v":"list?"},{"t":"s","v":">="},{"t":"s","v":"len"},{"t":"n","v":2},{"t":"s","v":"str"},{"t":"s","v":"sx-serialize"},{"t":"s","v":"first"},{"t":"s","v":" = "},{"t":"s","v":"hsx-inline"},{"t":"s","v":"nth"},{"t":"n","v":1}],"arity":1}},{"t":"s","v":"list"},{"t":"s","v":"fn"},{"t":"s","v":"map "},{"t":"s","v":" -> "},{"t":"s","v":"for-each"},{"t":"s","v":"for "},{"t":"s","v":" in "},{"t":"s","v":"hsx-is-element?"},{"t":"s","v":"hsx-extract-css"},{"t":"s","v":"rest"},{"t":"s","v":"hsx-children"},{"t":"s","v":"hsx-tag-str"},{"t":"s","v":"hsx-attrs-str"},{"t":"s","v":"get"},{"t":"s","v":"attrs"},{"t":"s","v":"children"},{"t":"s","v":"hsx-is-component?"}],"arity":2}},{"t":"s","v":"sx->hypersx"},{"t":"code","v":{"bytecode":[1,1,0,51,3,0,16,0,52,2,0,2,52,0,0,2,50],"constants":[{"t":"s","v":"join"},{"t":"s","v":"\n\n"},{"t":"s","v":"map"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,49,2,50],"constants":[{"t":"s","v":"sx->hypersx-node"},{"t":"n","v":0}],"arity":1}}],"arity":1}}]}} |