From 226c01bbf6169d15620b0dc12bcade4f1bfcac54 Mon Sep 17 00:00:00 2001 From: giles Date: Thu, 26 Mar 2026 17:04:39 +0000 Subject: [PATCH] Browser JIT: compile SX lambdas to bytecode VM in WASM kernel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Wire up jit_call_hook in sx_browser.ml (same pattern as server) - Deferred JIT: _jit_enabled flag, enabled after boot-init completes (prevents "Undefined symbol" errors from compiling during .sx loading) - enable-jit! native function called by sx-platform.js after boot - sx-platform.js: async WASM kernel polling + JIT enable after init - Error logging for JIT compile failures and runtime fallbacks Performance: 858ms → 431ms (WASM CEK) → 101ms (WASM JIT) Co-Authored-By: Claude Opus 4.6 (1M context) --- hosts/ocaml/browser/sx-platform.js | 16 ++++- hosts/ocaml/browser/sx_browser.ml | 57 +++++++++++++++++- shared/static/wasm/sx-platform.js | 1 + .../dune__exe__Sx_browser-42a03a59.wasm | Bin 0 -> 39154 bytes .../dune__exe__Sx_browser-42a03a59.wasm.map | 1 + .../dune__exe__Sx_browser-4feaf1fd.wasm.map | 2 +- .../dune__exe__Sx_browser-c4dd2355.wasm | Bin 0 -> 38228 bytes .../dune__exe__Sx_browser-c4dd2355.wasm.map | 1 + .../dune__exe__Sx_browser-cafa954c.wasm | Bin 0 -> 39400 bytes .../dune__exe__Sx_browser-cafa954c.wasm.map | 1 + .../start-29cf9a72.wasm | Bin 0 -> 1664 bytes shared/static/wasm/sx_browser.bc.wasm.js | 2 +- 12 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm.map create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm.map create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm.map create mode 100644 shared/static/wasm/sx_browser.bc.wasm.assets/start-29cf9a72.wasm diff --git a/hosts/ocaml/browser/sx-platform.js b/hosts/ocaml/browser/sx-platform.js index 12b055aa..6c90dcf2 100644 --- a/hosts/ocaml/browser/sx-platform.js +++ b/hosts/ocaml/browser/sx-platform.js @@ -16,8 +16,7 @@ (function() { "use strict"; - var K = globalThis.SxKernel; - if (!K) { console.error("[sx-platform] SxKernel not found"); return; } + function boot(K) { // ================================================================ // 8 FFI Host Primitives @@ -340,6 +339,7 @@ var _doInit = function() { loadWebStack(); Sx.init(); + K.eval('(enable-jit!)'); }; if (document.readyState === "loading") { @@ -349,4 +349,16 @@ } } + } // end boot + + // SxKernel is available synchronously (js_of_ocaml) or after async + // WASM init. Poll briefly to handle both cases. + var K = globalThis.SxKernel; + if (K) { boot(K); return; } + var tries = 0; + var poll = setInterval(function() { + K = globalThis.SxKernel; + if (K) { clearInterval(poll); boot(K); } + else if (++tries > 100) { clearInterval(poll); console.error("[sx-platform] SxKernel not found after 5s"); } + }, 50); })(); diff --git a/hosts/ocaml/browser/sx_browser.ml b/hosts/ocaml/browser/sx_browser.ml index 85415e6a..3f9cfbc4 100644 --- a/hosts/ocaml/browser/sx_browser.ml +++ b/hosts/ocaml/browser/sx_browser.ml @@ -555,7 +555,62 @@ let () = bind "request-arg" (fun args -> match args with [_; d] -> d | _ -> Nil); bind "request-method" (fun _ -> String "GET"); bind "ctx" (fun _ -> Nil); - bind "helper" (fun _ -> Nil) + bind "helper" (fun _ -> Nil); + () + +(* ================================================================== *) +(* JIT compilation hook *) +(* *) +(* On first call to a named lambda, try to compile it to bytecode via *) +(* compiler.sx (loaded as an .sx platform file). Compiled closures run *) +(* on the bytecode VM; failures fall back to the CEK interpreter. *) +(* ================================================================== *) + +let _jit_compiling = ref false +let _jit_enabled = ref false + +let () = + (* Convert int-keyed env.bindings to string-keyed Hashtbl for VM globals *) + let env_to_vm_globals env = + let g = Hashtbl.create (Hashtbl.length env.bindings) in + Hashtbl.iter (fun id v -> Hashtbl.replace g (unintern id) v) env.bindings; + g + in + Sx_ref.jit_call_hook := Some (fun f args -> + match f with + | Lambda l when !_jit_enabled -> + (match l.l_compiled with + | Some cl when not (Sx_vm.is_jit_failed cl) -> + (try Some (Sx_vm.call_closure cl args cl.vm_env_ref) + with e -> + let fn_name = match l.l_name with Some n -> n | None -> "?" in + Printf.eprintf "[jit] DISABLED %s — %s\n%!" fn_name (Printexc.to_string e); + l.l_compiled <- Some Sx_vm.jit_failed_sentinel; + None) + | Some _ -> None + | None -> + if !_jit_compiling then None + else begin + _jit_compiling := true; + let globals = env_to_vm_globals global_env in + let compiled = Sx_vm.jit_compile_lambda l globals in + _jit_compiling := false; + let fn_name = match l.l_name with Some n -> n | None -> "?" in + (match compiled with + | Some cl -> + l.l_compiled <- Some cl; + (try Some (Sx_vm.call_closure cl args cl.vm_env_ref) + with e -> + Printf.eprintf "[jit] DISABLED %s — %s\n%!" fn_name (Printexc.to_string e); + l.l_compiled <- Some Sx_vm.jit_failed_sentinel; + None) + | None -> + Printf.eprintf "[jit] FAIL %s\n%!" fn_name; + None) + end) + | _ -> None) + +let () = ignore (env_bind global_env "enable-jit!" (NativeFn ("enable-jit!", fun _ -> _jit_enabled := true; Nil))) (* ================================================================== *) (* Register global SxKernel object *) diff --git a/shared/static/wasm/sx-platform.js b/shared/static/wasm/sx-platform.js index 506061f0..6c90dcf2 100644 --- a/shared/static/wasm/sx-platform.js +++ b/shared/static/wasm/sx-platform.js @@ -339,6 +339,7 @@ var _doInit = function() { loadWebStack(); Sx.init(); + K.eval('(enable-jit!)'); }; if (document.readyState === "loading") { diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm new file mode 100644 index 0000000000000000000000000000000000000000..2a022ead0d30a4f55193b7c737f8066508b1e5ce GIT binary patch literal 39154 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 literal 0 HcmV?d00001 diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm.map new file mode 100644 index 00000000..57832e1a --- /dev/null +++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm.map @@ -0,0 +1 @@ +{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* JIT compilation hook *)\n(* *)\n(* On first call to a named lambda, try to compile it to bytecode via *)\n(* compiler.sx (loaded as an .sx platform file). Compiled closures run *)\n(* on the bytecode VM; failures fall back to the CEK interpreter. *)\n(* ================================================================== *)\n\nlet _jit_compiling = ref false\n\nlet () =\n (* Convert int-keyed env.bindings to string-keyed Hashtbl for VM globals *)\n let env_to_vm_globals env =\n let g = Hashtbl.create (Hashtbl.length env.bindings) in\n Hashtbl.iter (fun id v -> Hashtbl.replace g (unintern id) v) env.bindings;\n g\n in\n Sx_ref.jit_call_hook := Some (fun f args ->\n match f with\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (Sx_vm.is_jit_failed cl) ->\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with e ->\n let fn_name = match l.l_name with Some n -> n | None -> \"?\" in\n Printf.eprintf \"[jit] DISABLED %s — %s\\n%!\" fn_name (Printexc.to_string e);\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | Some _ -> None\n | None ->\n if !_jit_compiling then None\n else begin\n _jit_compiling := true;\n let compiled = Sx_vm.jit_compile_lambda l (env_to_vm_globals global_env) in\n _jit_compiling := false;\n let fn_name = match l.l_name with Some n -> n | None -> \"?\" in\n (match compiled with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with e ->\n Printf.eprintf \"[jit] DISABLED %s — %s\\n%!\" fn_name (Printexc.to_string e);\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | None ->\n Printf.eprintf \"[jit] FAIL %s\\n%!\" fn_name;\n None)\n end)\n | _ -> None)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]} diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map index 263fe161..5f9bd50f 100644 --- a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map +++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map @@ -1 +1 @@ -{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"y+WAujBwB,IADpB,IADY,UAEgC,C,EAVtB,IAAG,C,EAFK,EAAY,C,KADZ,O,CAAA,mB,CAAA,4BAA0B,IAAS,IAAG,C,KALrC,O,CAAA,mB,CAAA,mCAA8B,OAA+B,IAA7D,OAA0C,EAAmB,O,AAAA,I,AAAA,G,EAAA,IAAW,SAAY,IAAG,C,MALtH,O,CAAA,E,EAAA,e,CAAA,E,EAAA,mB,GAAA,4CAC4D,IAAlB,IAAd,SAAgC,O,AAAA,I,AAAA,G,EAAA,IAAW,uB,CACa,EADb,SAC1C,OAA4C,IAAlB,IAAd,SAAgC,O,AAAA,I,AAAA,G,EAAA,IAAW,I,EAAA,iB,CAAA,iB,CAAA,GAC9B,IAD8B,UAC7C,YAAe,wB,CAAA,4BAChC,KAAmB,IAAG,C,GANX,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,mC,CAA8B,MAA9B,UAA8B,uBAAyB,IAAzB,UAAyB,SAAgB,mBAAmC,C,KAD5G,O,CAAA,mB,CAAA,mCAA8B,IAA9B,OAA8B,SAAgB,mBAAiC,C,KAL3C,QAA/D,OAA+D,YAAhB,WAAgB,IAA/D,cAA+D,YAA/D,cAA+D,QAAxD,cAAkF,K,SAH7F,O,CAAA,4B,CAAA,iB,CAAA,E,EAEE,WAFF,OAEE,GAFF,sB,GAAA,kC,CAAA,sC,CAAA,aAEE,qBAEO,SACF,IAAG,C,MAPmB,O,CAAA,qB,CAAA,4BAA0B,MAA1B,OAA0B,8CAAqB,mBAA+B,C,KAD7E,O,CAAA,mB,CAAA,mCAAkD,QAAlD,OAA4B,OAAM,aAAgB,YAAa,EAAS,C,GADnE,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,iC,CAA+B,MAA/B,UAA+B,uBAAyB,IAAzB,UAAyB,SAAgB,EAAS,C,MADpF,O,CAAA,E,EAAA,iB,CAAA,iC,CAA8B,MAA9B,OAA8B,wBAA8C,IAAnB,EAAR,OAAQ,aAAmB,QAAQ,IAAG,C,EADtD,sBAAa,C,KAA9E,O,CAAA,mB,CAAA,mCAAqF,IAAlD,GAAnC,OAAmC,IAAP,OAAO,aAAkD,SAAQ,IAAG,C,KAFxB,KAAe,IAAf,mBAAe,oBAAsB,C,MAA7G,O,CAAA,mB,CAAA,4CAA8D,EAApB,QAAR,OAAQ,eAAoB,0BAAqD,eAAuC,IAAlB,QAAL,OAAK,aAAkB,K,MAJzH,O,CAAA,mB,CAAA,mCAA8B,IAA9B,OAA8B,iBAA8C,IAAlB,QAAL,OAAK,aAAkB,K,KAD/E,O,CAAA,mB,CAAA,0CAA8B,aAAgB,IAAG,C,EADQ,UAAQ,C,KAA/D,O,CAAA,mB,CAAA,mCAA4E,IAAzC,GAAnC,OAA8B,eAAK,aAAyC,SAAQ,EAAO,C,KAD3F,O,CAAA,mB,CAAA,iCAAoC,OAAiB,EAAU,C,KADrE,O,CAAA,mB,CAAA,iCAA8B,OAAiB,EAAU,C,EADvD,O,CAAA,iB,CAAA,E,EAAA,iB,GAAA,4BAA0E,OAAiB,EAAU,C,KADpG,O,CAAA,mB,CAAA,0CAA8C,OAAiB,EAAU,C,KAD5E,O,CAAA,mB,CAAA,iCAA8B,OAAiB,EAAU,C,KAD1D,O,CAAA,mB,CAAA,iCAA6B,OAAiB,EAAU,C,KADvD,O,CAAA,mB,CAAA,iCAA8B,OAAiB,EAAU,C,KADvD,O,CAAA,4BAAuB,sBAAmB,IAAG,C,KAD5C,O,CAAA,4BAAuB,sBAAoB,IAAG,C,KADlD,O,CAAA,mB,CAAA,iCAA6B,OAAiB,EAAU,C,SAHjF,O,CAAA,uCAA8B,uD,CAAA,mCAAkE,MAAlE,OAAkE,8BAAyC,IAAG,C,SAF5I,O,CAAA,uCAA0B,yDAAsD,EAAtD,OAAsD,wBAA+B,IAAG,C,KAFlH,O,CAAA,qB,CAAA,mCAA0B,wBAA2B,mBAA6B,C,SALlF,O,CAAA,qB,CAAA,yCAEyB,2C,CAAA,iCADQ,+BAE1B,mBAAyD,C,YALhE,O,CAAA,4B,CAAA,yCAAyF,yD,CAAA,mCAApD,QAAoD,OAApD,+BAAwG,IAAG,C,KAFnH,O,CAAA,4BAAuB,8BAA0C,IAAG,C,SAbjG,O,CAAA,uCAMI,cADW,MALf,QAKe,aACX,mB,AAAA,I,AAAA,G,EAAA,KCteR,yDDue8B,kBCve9B,UDue8B,2B,EAAA,4BALxB,OAAK,MAAL,QAAK,aAAyB,G,AAAA,I,AAAA,G,EAAA,KClepC,yDDme8B,cCne9B,UDme8B,2C,IAKnB,IAAG,C,KApBqB,O,CAAA,mB,CAAA,mCAA4D,IAA5D,OAA8B,OAAK,aAAyB,SAAQ,EAAU,C,EAD/E,EAAS,C,EAPrC,K,CAAA,E,EAAA,iB,GAAA,4BAAqC,GAAS,sBAAiB,C,EAAQ,IADjE,EAAkB,KAA1B,OAA0B,aAC8C,OADhE,aACiE,K,MALvE,QAAgD,GAAhD,OAAgD,qB,GAAA,4BAAX,EACzB,6BACL,uBAAiB,C,EAAQ,IAH1B,EAAR,cAA0B,EAA1B,OAA0B,aAGO,OAHzB,aAG0B,K,KAPH,O,CAAA,4BAAuB,uBAAgC,mBAAiC,C,KADvF,O,CAAA,qB,CAAA,mCAA0B,wBAAmC,mBAAkC,C,SAb/H,SAIO,2CAFL,OAAqB,eAAa,K,CAAA,iB,CAAA,wCAA6B,sBAAe,OAAf,aAAsB,KACrF,yB,CAC+B,C,KARK,O,CAAA,qB,CAAA,mCAA0B,uBAAuC,IAAG,C,QADlE,O,CAAA,4BAAuB,YAAvB,SAAuB,GAA0C,UAAP,OAAO,cAA6C,OAAW,IAAG,C,QADtI,O,CAAA,4BAAuB,YAAvB,SAAuB,GAAgC,UAAP,OAAO,cAAmC,OAAW,IAAG,C,KALzG,O,CAAA,4BAAuB,sBAA2B,mBAA+B,C,KADnF,O,CAAA,4BAAuB,sBAAyB,mBAA6B,C,KADxE,O,CAAA,4BAAuB,sBAA+B,mBAAkC,C,KAD5F,O,CAAA,4BAAuB,sBAA0B,mBAA8B,C,KAD/E,O,CAAA,4BAAuB,sBAA0B,mBAA8B,C,KADhF,O,CAAA,4BAAuB,uBAAyB,mBAA6B,C,MADvE,O,CAAA,qB,CAAA,qB,CAAA,0CAA6B,wBAAmC,mBAAmC,C,GALpI,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAAqE,uBAApC,IAAoC,UAApC,iBAA2D,EAAa,C,GAJzG,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAAuE,MAAvE,UAAuE,+BAAtC,IAAsC,UAAtC,iBAAmE,EAAU,C,GAF9G,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAA0D,EAA1D,UAA0D,qCAAzB,aAAyC,IAAG,C,GAL7E,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAE8D,MAAzC,GAFrB,UAEgB,eAAK,aAAyC,uBADG,IAAzC,GACsC,UAD3C,eAAK,aAAyC,SAE1D,IAAG,C,GALV,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAAiE,MAAjE,UAAiE,+BAAhC,IAAgC,UAAhC,iBAA8E,IAAlB,QAAL,OAAK,aAAkB,K,GAF/G,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,qB,CAAiE,MAAjE,UAAiE,+BAAhC,IAAgC,UAAhC,iBAAuD,EAAS,C,KAJnE,O,CAAA,mB,CAAA,mCAA8B,IAA9B,OAA8B,SAAgB,mBAAgC,C,KAD7E,O,CAAA,mB,CAAA,mCAA+B,IAA/B,OAA+B,SAAgB,mBAAiC,C,KADhF,O,CAAA,mB,CAAA,mCAA8B,IAA9B,OAA8B,SAAiB,mBAAiC,C,MADjF,O,CAAA,E,EAAA,iB,CAAA,iC,CAA8B,MAA9B,OAA8B,wBAA4C,IAAnB,EAAP,OAAO,aAAmB,QAAQ,mBAAgC,C,KAHpH,O,CAAA,qB,CAAA,mCAA0B,wBAAgC,mBAA8B,C,QADvF,O,CAAA,4BAA8C,IAA9C,OAAuC,mBAAM,OAAlB,aAAmB,OAAQ,mBAA+B,C,YADvF,O,CAAA,4B,CAAA,iB,CAAA,E,EAAA,0B,GAAA,wB,CAAA,0CAAgE,qBAAM,8BAAY,mBAA6B,C,YAD9G,O,CAAA,4B,CAAA,iB,CAAA,E,EAAA,0B,GAAA,wB,CAAA,0CAAiE,qBAAM,8BAAY,mBAA8B,C,YADnH,O,CAAA,4B,CAAA,iB,CAAA,E,EAAA,0B,GAAA,oCAA0D,qBAAM,2BAAU,mBAA4B,C,YADrG,O,CAAA,4B,CAAA,iB,CAAA,E,EAAA,0B,GAAA,oCAAyE,IAAT,qBAAT,EAAe,OAAf,aAAkB,UAAQ,mBAA6B,C,EAD/G,iBAAc,C,EADC,IAAb,IAAJ,OAAI,aAAa,K,MARzC,O,CAAA,iB,CAAA,E,EAAA,mB,GAAA,uD,CACmC,EADnC,UACoB,cADpB,OACoB,eAAK,eAAQ,SAAE,6B,CAAA,qBACI,IADJ,UACd,IADc,OACd,eAAK,aAAa,UAChC,mBAA4C,C,YAbnD,O,CAAA,4BAEE,eAFF,OAEE,kCAAY,cACF,QAAR,OAAQ,eAAoB,yBAAkC,a,AAAA,I,AAAA,G,EAAA,KC/WtE,qEDiXgB,QAAR,OAAQ,eAAoB,yBAAqC,IAAF,iBAAE,cAAsC,iB,GACpG,mBAAoC,C,MAZ3C,O,CAAA,gCACmB,EAAP,OAAO,aAAgB,OAA6C,IAAvC,oB,EAAuC,4BACxD,EAAP,OAAO,aAAgB,OAAgE,IAAxC,EAAiB,EAAnC,OAAmC,aAAmB,OAApC,eAAqC,oB,IAC9F,mBAAqC,C,KALnB,O,CAAA,qB,CAAA,qBAA+C,IAA/C,cAA+B,OAAgB,QAAQ,mBAAmC,C,EAN3E,YAAQ,C,KAEvB,mCAAe,WACN,QADM,OACN,eAAnB,QAAqC,OAArC,aAAkB,UAAmB,C,WAXpD,cACc,O,EAAA,uG,CAQE,EARF,SAMH,GANG,YAMH,IAAT,OAAS,eACA,SAAT,OAAS,aACT,OAAiB,eAAjB,EAA+B,OAA/B,aAAc,+E,EAAA,WARF,EAQE,6B,GAAA,qDAJd,OAAgB,eAAhB,EAA6B,OAA7B,aAAa,0E,EAAA,wB,CAF8C,EAE9C,iBAFyC,EAAK,0B,CAAhC,EAAgC,iBAArC,EAAK,0B,CAD8B,EAC9B,iBADyB,EAAK,0B,CAAnC,EAAmC,UAAnC,OAAmC,OAAnC,iB,CAAA,4BADe,EACf,UADe,2CAWhC,IAAK,C,KAlBZ,O,CAAA,qBAC2B,IAD3B,OACS,QAAO,aAAW,OACpB,mBAAiD,C,KAPxD,O,CAAA,mB,CAAA,mCACgD,IADhD,OACkB,OAAK,aAAyB,SACzC,mBAA8C,C,YAXrD,SAMO,oBANP,OAMO,8BAFE,2FAHK,+FACI,UADJ,OACI,8DACN,sEAEG,UAFH,UAEG,4C,GACiD,C,SAZhE,O,CAAA,uCAEY,yDADG,EACH,OADG,wBAER,mBAAqD,C,SAV5D,O,CAAA,0B,CAAA,0CACgB,OAAQ,eAAyB,OAAoE,gBAA5C,oC,IAAA,mBAC7D,yDACS,EADT,OACS,wBACd,mBAAgD,C,KARtC,EAAO,I,EAAP,mBAAO,cAAgD,C,SAblE,iBAA6C,OAClD,EAA+B,QAEZ,IAAuC,SAAnD,aACR,G,CAAA,4BACc,eAAmD,aAAd,SAApB,EAA4D,GACnE,MAL+B,MAKJ,C,MAdrD,OAAG,EAAH,OAAG,EAA8B,OAAI,EAAJ,OAAI,EAAmC,OAG9D,UAA6C,OAClD,EAA+B,QACuB,IAAuC,SAApD,WAAsE,OAAnF,aAAT,GADmC,OAAe,GAHvD,MAImG,C,MAtBtH,OACW,EADX,OACW,OACgB,MAAuB,IAAwC,OAA/D,aAAgE,OAA9E,aAC0B,SAAb,SAAxB,GAA0D,G,AAAA,I,AAAA,G,EAAA,KC9Q9D,0DDmR6C,ECnR7C,UDiRI,OAEyC,aAAX,IADyB,eAArD,MADK,WAGP,QAIyC,EAAmB,EAF5D,OAE4D,aAAsB,OAAzC,aAAX,IADyB,eAArD,MADK,WAGP,QAAwB,C,KArBxB,OAAsB,MAAtB,OAAsB,aAAoB,OAA5B,aACkD,IAApD,gBAA0E,U,KAH7E,OAKJ,IALI,MAKX,MAJA,oBAIA,WAAO,cACP,OAAwB,C,EAToB,I,EAHP,cAAkB,QAA3B,aAAX,EAAwC,C,EAHpB,cAAkB,OAA3B,aAAX,EAAwC,C,SAf9C,kBACX,aACA,eACA,OACa,QADb,OACa,eACX,aACiB,IAAgB,G,AAAA,I,AAAA,G,EAAA,KChPrC,sEDkPI,aAC4B,IAA5B,OAA4B,aAAX,GAA6B,KAAC,C,KAhBjB,EAAP,OAAO,IAAP,QAAO,cAA6B,oCAAU,C,YAL7D,aACV,OACc,EADd,OACc,eAGZ,GAFA,cACA,I,EAAA,KACA,0BAA4E,U,AAAA,I,AAAA,G,EAAA,KCnOhF,0DDsOkD,ECtOlD,UDsOsB,OAA4B,aAAX,GAA6B,0DACjB,EADiB,UAC7C,OAA4B,aAAX,GAAmC,O,MAhB9D,kBACX,OACuC,EADvC,sBACuC,aAAb,SAAxB,GAA8E,G,AAAA,I,AAAA,G,EAAA,KCzNlF,0DD2NgC,EC3NhC,UD2NI,OAA4B,aAAX,GAA6B,M,EAXA,gCAAyB,C,SAJ/D,aACV,OAGE,MADA,cACA,GAAa,IAFD,EADd,OACc,aAEZ,OAAa,aACW,SAAxB,GAA4C,G,AAAA,I,AAAA,G,EAAA,KCjNhD,0DDmNkD,ECnNlD,UDmNsB,OAA4B,aAAX,GAA6B,0DACjB,EADiB,UAC7C,OAA4B,aAAX,GAAmC,O,SAhB/D,aACV,OAEwC,MADzB,EADf,OACe,aACb,OAAsC,aAAoB,OAA/B,aAAV,EAA4D,G,AAAA,I,AAAA,G,EAAA,KCvMjF,0DDyMgC,ECzMhC,UDyMI,OAA4B,aAAX,GAAmC,M,EAZJ,eAAlD,WAAoD,EAAG,C,KA3FhB,kBAAhC,MAAkB,IAAlB,IAA+C,C,SAMlD,OACY,EADZ,OACY,SACV,MAAiC,KAAU,e,EAC9B,iBACb,SAAkB,G,AAAA,I,AAAA,G,EAAA,KC5G1B,0DDgHiD,EChHjD,UD8GQ,OAEyC,aAAX,IADyB,eAArD,MADK,WAGP,aAAwB,C,cA1C9B,QACS,QADT,WACS,gEA8BM,aACb,0BAAY,IAckB,EAH9B,OAG8B,aAAX,IAHnB,wBAG6C,mCAzBtC,EAAP,OAAO,eAAkC,K,CAAA,iB,CAAA,4BACnB,WA/CxB,kBAAsE,IAiDvD,MACV,YAAwD,iBACxD,EADwD,OACxD,cACoD,eA1BhD,EAcY,QAAnB,OAAmB,aAAoB,OAA7B,aAGmB,IAFZ,aAE+B,YALpB,IAFX,aAE6B,YAJlB,IAFX,aAE6B,yBANjB,EAAsB,YADxB,EAAW,EA+CzB,aAE2B,EADxC,OACwC,aAAX,EADZ,WAE6B,C,EC3HlD,G,KD4IU,OAAsB,MAAtB,OAAsB,aAAoB,OAA5B,eACF,MAAuB,KAAnC,OAAmC,aAAvB,EAAkD,U,KA4B1D,OAAa,MAAb,OAAa,aAA0C,eAA1C,aAAiE,OAAlE,aAAiF,U,WA3CzG,WAAG,EAAH,OAAG,EAA2B,OAAI,EAAJ,OAAI,EAAgC,OAE1C,IAAb,IACT,WAEsD,IAAlC,IAAkC,mBAG5C,UAA0C,OAC3C,EAAiC,OAC1B,IAAuC,qBAGnD,gC,EAAA,aAT2D,IAA1C,IAA0C,mBAarD,UAA0C,OAC3C,EAAiC,OAC1B,IAAuC,qBAElC,UAAoC,OAClD,EAAwC,OAa/B,MACV,WASU,QAAR,OAAQ,eACR,eAAW,kBACD,MACV,oBACwB,MAAtB,OAAsB,aAAmB,eAAnB,aAA0C,OAA3C,aAAb,IACL,IAAY,K,CAAA,EACb,IAAiC,EAAkB,IAAlB,EAAb,SAA8C,OAAlE,eAAkE,yBAEtE,yBAfyE,IAAtC,QAAd,EAAoD,mBAKwB,IAHlF,UAC8B,MAArC,EAAmF,SACtF,EAAL,qBAAK,aAC4F,mBAN1B,IAAtC,QAAd,EAAoD,MAiBlE,M,QAhCwC,eAChC,MAAD,UAAX,EAAkD,OA5G7D,aACA,gCACO,iBAiHW,QAAR,OAAQ,eACR,EAA2D,IAAjB,WAAiB,WAA3D,cAA4D,YAL+B,IAF9C,QAArC,EAA6E,SAChF,EAAL,qBAAK,aACsF,M,MAAA,aApB1C,IAApC,IAAoC,MAkDlD,M,WAxD+D,IAwD5D,C,EA1HZ,uDAAqD,C,KA/BrD,EAAM,I,EAAN,OAAM,eAAiC,QAEX,IAAlB,OAAkB,4BAA2C,+BAAC,C,KARxE,aACA,gCACA,+BAAkC,EAChC,C,0CC1BJ,I,EAAA,GDoB6C,SCpB7C,ODoB6C,eAAkB,S,EAAA,YAkBtC,MAgBhB,IAfkJ,OAelJ,cAEQ,IAFa,OAEb,eAAW,I,EAAA,KAY6D,mBAZ7D,OAWd,IAC2E,qLAgPvF,UAhPuF,OAgPvF,GAOA,EAF0D,QAE1D,KAMA,EAF+D,QAE/D,KASA,UAKA,UAqBA,UACA,UAMA,GAF+C,QAE/C,KAUA,WAIsD,UAKtD,WACA,GAD4C,QAC5C,KACA,GAD2C,QAC3C,KACA,GAD4I,QAC5I,KACA,GADmI,QACnI,KACA,GADgJ,QAChJ,KACA,GAD6I,QAC7I,KACA,WAGA,WACA,WACA,WACA,WAGA,WAEA,WAEA,WAKA,WAIO,KAHyE,gBAGhF,OAAO,cACA,OAAP,OAAO,cACP,WAEA,WACA,WAGA,WACA,WACA,WACA,WACA,WACA,WACA,WAGO,QAH0G,OAG1G,cACA,SAAP,OAAO,cACP,eACA,GADyI,OACzI,KACA,WAGA,WAcA,WACA,WAGA,GAH0H,OAG1H,KAKA,WAIA,WAGA,EAHwC,OAGxC,cACA,WACA,WACA,WAGuE,IAAlD,GAH2F,cAG3F,aAAkD,MACQ,IAAtD,GAD8C,OACvE,OAAyB,aAAsD,MACA,IAAtD,GADsD,OAC/E,OAAyB,aAAsD,MACxE,OAAP,OAAO,cACA,OAAP,OAAO,cACA,OAAP,OAAO,cAGP,WAYA,GAHa,OAGb,KAEA,WACA,GADoG,OACpG,KAEA,WAKA,WAEA,GADqF,OACrF,KAEA,GADqH,OACrH,KAIA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAGA,WAEA,WAEA,WACA,WACA,WACA,WACA,GAD8G,OAC9G,KASA,WACA,WACA,WAMA,WAGA,WACA,WACA,WACA,WACA,WACA,WAOS,MAK4B,MAArC,aACyC,MAAzC,aACoC,MAApC,aACwC,MAAxC,aAC4C,MAA5C,aACoC,MAApC,aACsC,MAAtC,aACuC,MAAvC,aACsC,OAAtC,aAC8C,MAA9C,aAC0C,MAA1C,aACsC,MAAtC,aAC0C,MAA1C,aACuC,MAAvC,aAEqD,eAArD,WAAwD,gB,ECxkB1D,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]} +{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* JIT compilation hook *)\n(* *)\n(* On first call to a named lambda, try to compile it to bytecode via *)\n(* compiler.sx (loaded as an .sx platform file). Compiled closures run *)\n(* on the bytecode VM; failures fall back to the CEK interpreter. *)\n(* ================================================================== *)\n\nlet _jit_compiling = ref false\n\nlet () =\n (* Convert int-keyed env.bindings to string-keyed Hashtbl for VM globals *)\n let env_to_vm_globals env =\n let g = Hashtbl.create (Hashtbl.length env.bindings) in\n Hashtbl.iter (fun id v -> Hashtbl.replace g (unintern id) v) env.bindings;\n g\n in\n ignore (fun f args ->\n match f with\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (Sx_vm.is_jit_failed cl) ->\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | Some _ -> None\n | None ->\n if !_jit_compiling then None\n else begin\n _jit_compiling := true;\n let compiled = Sx_vm.jit_compile_lambda l (env_to_vm_globals global_env) in\n _jit_compiling := false;\n match compiled with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | None -> None\n end)\n | _ -> None)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]} diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm new file mode 100644 index 0000000000000000000000000000000000000000..86ef9e340d6250f7be6364eded6d2d5907375800 GIT binary patch literal 38228 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%0AjCd!{ipkqFleH5xtGi8d4kV8_7A|Bc-3 zj447ebHejgDm?!f@9r1rdz}&Ad&xb|f4O&Cje1PnwL#wmhrn~8q6Q+_+~Fc=u<|hC z*J+d0%(8+)1%#jwnV!Sa3M)TUW~M9ltLVak8Sl5kmrn+MmR;yTW|6z<7p@_dk_h^2&b1)VIIBu&Fw zCOTUj#~~u8ZqkTt@{d={>%1L{b1YI23KezhM4Bq;*x9@k5{DDYfHb8@hnB>8+rnZT zR$S|sgsXjFTpJYE2}{Cd4Qn2ioT#`qdZ#rOTqwXoI;-AK+w4g~FKwFQ%oR)Hj^T0@Nm@LUd?|n?tFl)$ie4t`Q4OOJV`~ z30SC27eg$Bwan5GJ=Z6gE8~`|J&l7W&!Eog82GmGkN(FpUUCU`VNRy%(T#H0)K9aA-1SGL;)=F1NLYgqkiLJhRvBby+s zA@jd>TL(KthPr+ZguJNiheUMQz^ezdY(Q!mEE`aM-a}}xB%I77fXX%16c(e&_EcnK z>-m48W#u>aq zPLOEQ1d?U4Hy5&)o@!3&pTc`so4gA-dP|g+MJxvops)!Bwjw$m3jG9m1`~xDMK)S% z))tugPI7qR;ivr%@K$Vte9UhZGf~>YY4Ft;jC~(8#d5BHswf(Zbh8iDh(6av6f{4< za!u*$L)>P6_m`#H1LrYQ)qJ#jrz`QN%}%kA$pXZt`gM8bynJk5a^}#H#-pT$j%}mk z>Ffcp`j=>a=}6;=l^xIuBN~r4n-RYu6D|D7%rCkQw{)GMP(fg3to>LyYOrCwi_nS1 zXx8W^o8SzW9auw}olf9LcA8-m)Eq{TB3dvsN5@83VPlj&D#}w&ydQhE9=5_AzXL0< zT814j+t}S2Pn`9E8J^Fy!LeUchuq{Tg{5pcndk*Pypt|MF{rU*$uQEqt=DCKz%hi!E#yU?(*JkOw9dIa*)U#})Y4TX8W!FdZ2zJhFmfnBDW zJ@ERJtdS>0XKYto$k-pU6ys1;Z#8KdCr)hQmdCAzo@=O<7>y{QHFN#Li&p#aLYysd z?9CnIU$FQNIvj?{0|C0Z;XMfvyaY7ZIpJX*6M|bna6+jpm11jKKl}L!y9;?Z;V_kR1sxf$x>U2lh(Q*8+F*nD#fHF_ zEUo>1brx%!)?Q*p+xS!i9asaRw^1zxHP3zOqw5S|*sHg>5Q_(!C#nl#$q2)5rE zOq(^cn%Ru%Z>pc%uwrX+C|IU7z}4`Pb-&55CEG?q$nS}?5Z>^>8zF`*+0N<0174d+ zhvw!ex0n6D!)-OmoR{0z8E*fWb;}Q!3$r&rKh@k?`00^9`ykug5$Ah@VQPi$ z(P4JdH9g$aL(+;#)VOL}VA>&1_CAa4g}R)#MrrfD0ATke~>Wc<76W4Zz5YA+>pW+bmP<-xWh3(d~9IirsMpvKE~iTn*7`k?Gs1k7eYDK75DRva|l@bnt&4H@%pBUAppjtsT^7g*PcE*Tb&W15M8=Q4RGuxGNPg;yUENo-!exueAhuiy3G zuQQ_b8Bil?@J>j7%zqkwAgXN8j1?Y_8A-@^{?GP;9rFD7) zPk(^lOquaM@Kt@akjM8hz4L}cN1Q{~ruunXUIl9n|2VCoS0@A6;Te7q_q_qKY&a}t z!v@%MZGDV4OD%iYL#=s93;AU5v<2noJ!a4U2D8Vg{eUx**;F|bW@7x}ON|0GMHQhN zRVH4E)xW?uVV9y7Uc-B1cn%J=@FAn9!%sj{3(wP>F+B6qrs-zxvaBj0kDo%bH?n-K zLBbQ%nK>p|Jp7sv3lcod``Ai$T-E8l*Ef!)!DNncnNL@QfH?L0)ip{e$*5T_OqdYz z*2eKljee;Qgm^|*KK(X*%{**SHiAXs<)j(^TRe4hN;}^ZfGGvE4{1b<5HAx5q1HTH zwhzi8FLLT+E(t4>(qJ;@C-U;}S@90U`Oy%oE-Yg(sruzB6UE3RPgoeW7nh6&@6LzK zLY`?iL~kT{P$LNS^HU3yRhpMfH_R{KS*@4pJs7$iM6SpFPrgWD^N9kpgXdoFNA}Fi zs=8MKG#=HyZBiRoU@Xy0WPWcjxv>Tdd>4bXCili(R=XnbO#3Jl|AGLKuLFHNpJH??_M^5 zUU)c1#$H~h;>$F##3@LTb=x_ymaX%7oS%TE4JNMsr-ZaQx0ezhq2R?z`%+b1e6_LF zPF#`rV_)-59ETw2KjkKli~CRF>UlR1c_lgeD*- z1|=a$40e%AaNm%>&a0X>(#D-qdi?>p5hY2^6AhmakK>5IYj5tTytF`+Jab zG>hybnO388{2=gp-o+5<;jG@nIU_zClQ0aV{t3GqdePTv=oOp?p-&UO{>Aj->tAy3 zc7KSx3xKzq`R`^8b+b*s8r~?rF#Dj0yqmqi?S{_goWsN3A*N})!$`o3JO2Az?`X6! zwae$+9blnb=0}r|fyFWMXBkt5^oBnt)eXTcxhgkJC|)8z_Lk zu@yE!cU6NI8~C}m?E@z90NF`wtTio};AECQ$QO1H27<}4W*ol+1va!b%-@LO-WKTP z2$kUx%V7AB7ovA+p9NSMZQu)@=ZV>?oB=3uEXjcL9lf8t*tNW`0YLxBZrS8Wx z97FxOeZbf-IX624u{j6i!3OJJ=r)@WwPFmMr=P7s-g}az04I=cHGu>tK_-qe-g|Nnejwc+&Q2L?G&{wB0dkZTd1X=LeGaR{`vS+xiOQkbFhN^ zmP-Jvksq_ZoTGPRQ7ti|*ZP*|J_u2PBh;EdbRU>M%4+`mmuNXh)K7vkog9kkug~$0 zf^V!;+tRP6v3}u>;CCgP&_;}%@_x>;Sp)G@LoMXGeU-8E~tMJP)_+=k+-^We{ z2VF9kY6^W#{v*f={RYW;;&?W#KFK397$&r1%RQV1`Kfsy2<}yv=KJybH*gt$4{@G) ze=Aa$E{+~q%g*agMW`Z#RK7xc+r9gLtR4_tQe!-A$4F}QSz&qFVB zeMEqrnMaZoJmm@d1ah*v6;4yI!bt#s3{KXXI7PqkL=yv8So^D3pu&f&1CzpTmdR4fAD!NcwZ_HREqS3Nn3BgUM(&$PT0#eUG zl$U_Z5iP|Wur~p5vIo_KY#)EO0NlgXLf$OF7cNf`maBiB^r z#rr2nK~;(QWeW)W$?O&VGa@Q&-qZ09 z_$?Zw1i~0{=)SzaDOwL8qaQ=gqJwQu-GZ#G4j@n*c5n|Cv{=J?r#dl?Qfa=kUrT3C4D@p zAwd!B1C&^X0ONEGw9Pq*{#aidmd|m7(ze-WsgLWhogMF@*{6t~IW6yBHv1&&43`+H{Z#~eE6^!Bfuz0Z_-{VQhg(b1F>Cvh+NZ<@W^)XD9Yvv-AW-|YVl zdNbTx{J%A&xB7o)N>`EpO;fy@W^WC5d>i?HZ<;#N-{zzVj|ksR{iT~2e`Q*pCjZx31f|Q;y&UnwL2R}E4Eg_IfS)CQ&J;gD{(owb zBdq^lyott9%cjcVP{|Rxzggh^o8fqSeqOj1f%^@^ahf$RTr22BYSmcBXu}lT(on2u z!)|kH!#4lJXnjHG#V?S5lPUf_ z`8S*5ACP~GDSnasTTSsxZy8p)uB>BuiJ0V#ijGLt z(Oi{CYzjdg&Q;4JRY!2uib%(oaaDVyYJjUcBUQ(6Rac~{4^{qOQ>1PUgLOx$j^e5) zexIv)B7_~rRVyPM`?;z&QgtM%>QYLUO5zZ-upl8dNF+YAFFb3gvp8ukp)>ri(<0FshxsK0}6FQlis^wv~daiU+=-B932OpSR zwr4`e<@{tmCa^htpmU3Kmh+lhL&q_<1*a{yS5HPZhbep28go|ivY^Huh1^kp(s5_x zv|!NI)##k!MBOpO%Om}8%5b+HBD_M+2=37%fLH1XzrFIYewBP|I3#lX?x8JmsOkP~ ztK~FT7R6zqgK^h{&b>W6IM()v$f>nQh7YCflN)p9Y=6y>vID`1v3|{gu*vFquSYdF z&h=$=r?nm(J&g63&{?Z5?~!9PYmQkxw!sOjYl9<3_3YADD2zQORnAo%tUprqxG0zm zbbN4#sXZxuU2tM5)S3!zAnu{y5K}%kG&nhRI6z?!OUwez=EEV zdSZY(azN@vJ+suFR9Zb7^`yFEQD0eqBI>JDqD*aJXT~0e`f9~#YH@t2#r~Q`N1&c; zPCq?G4nEz~%;Y6gY092TBd5{m>6G70V`tF#nY8;XnmC&#&!MSvsj!8L=h5`}v}Y@o zE}-&jsj`h`w$t7nwC_UNe-RzHn69{l(wEYym(gjjqtjnco8LfZyphh#&{>z$*;zVg zgw7qMEjcyV=rP+-&)+Zg%fg zjm!SG;d0>ZxLk1!F6npRa_T#AIqh0pPQMP9&DY~{#tpcfc_S`o-Gs~8H{){7Ex4R} zD=u4Z!{xkp;d1`FaoKu1F0Z|V+H?8*v>vyMzv7YIb|)^|@4{ur-MCzM4=xwoORdJPe%D6TEQ*$TxFax z&&RdCm)f~jPr`m!I~#9*MDN%RVPB6@w|3{_TiJeh;f!UxE0ewWacbojJ`MT_>JV%= z|60zbe;?W}c~aZ?Q0%9ujoak_+4s|`Qob@%DrEMKXEWvTTs||pD_g)3;!mU3rO)7U z*|X%K*G!(r+g<(us@6S+OX`ET3}L%aJxM@5Ozpxn=7O=pM@Ygv(B&rcABD^&CyS#Q zz5N)qR*KV;`Mvqck5kL&OsRArGxQ1S&{B4KIy00>ebTlJe~Q|)WjHhR=`hrACKdZz zcfg5{0QZET3{Yqfp2EodKZcXyXPfmxSHEsIOU=rs51y1Y_;6q?)%28I&LEmE#ban*8ze7IW* zLzxXdt!B7&E2RX+*Yz5xjjK%IghLJZNvloa#KQuS46m^$h7Px-4M*70`XddF^?kM~ zHDLOJAU{Aelr*SQM+qPZ8E*Od5g&4$&T~R1DW6j&bAGaG4?#}zS=mkY9Ak4%a&crgj*Q3Tk23xv>L0$G%OQNp)Df** z#iuAE13<|fq1-3ce13Aj_LpOlG4%t4x$=cFcp|&s2oCQ~HjftZ7mSmb_yGcc% z5V5@a2xd~^(`0sPB$s8GKqGk^UCyEWHMZl>x|4%q>Xe{3v?(YKr}=#AQ{%WKQ>V$t z(CMOr=~8hoN73ox^kxxrP%%^9bw(Rgfao@P;LIK_@`2qPh_h2_n`Z^aF739oXC108vFJvdThz_|%Lh*UQ?ewl}Ie&i8yIjdnZxyQ$3*Zjr zO16@}AmDEOYlGs3Z9(yb?LqOx9m1=g)r~o9Du1DnV~ka5E~*-tslHe`so9D7ULquN z^qb0;cIGb?hWR$Xzk&nGFB1pgd!%=-6Z-jvXW-WdO-KXZ5Zr*#Hy&z438qnHm)>{@jLJSo?iy_9dljB$9tCq?n zOs-)xXqPFx+J;&Ll_@oIWAxQl8<+~x&WQlG!65({I0ELVV$k2hsE_dU#nep;{}`P` zaz{IY6olM$<%dK0C+$$ zbv>!61Rj!1-9RE$?jt^wOx;MreaOv{shg9W2Bfna67Gz;(%C?evVJ(O8LSaBvxKU z6mCqW-m_ry(4Ev9MV%cR<3j)r+(i-~s%V8ijlOr&;n7aKiVwBlqr64KW-@iJ>P-V_ z9_z3BR4H5`u{W8*5crXH+f;uxPyJ)|11P6El)dyxvu%$^(` zepoFIsF5!uQ;#UqwUbIR^{C=yb`j^505XMs^)8p{_sfC9uW%oU;BjobX2qwzx&U|K9esVfrdPZ%E zse%FU3MY%~d~g0)MH{L6fJzjLE?xprUOeb<5`T`I+>N9ox2lSovaY!L2`He9nf)kE-Y@n1-i|lOXtG#tHXN z^TaZh9W50aO`DFr5WU2Q~6JmM4rm7 znZm?p%-CF(Sp7RnoHTMo`CSb^I_77!r%?1cZ5S_40`>1{ufXI#uU5l^@nZE03R|8o z<+HipSMFe8mGQz17N^C+AE?Ys%B1f6MdjGku`ho~?ZMQTVDN{EO;KmEl}f4nN7_@v zlMMM~#V<9m4$|g36z$K=M=5l>?F^f5ljVO9Cp%CsTi_u!#FI5o&UrO#PY43!Gx68ZT7-T)EJDP3UJ;)_Z31r325K zIY1VYf1w1GFrDXhk@**WrDDzah&0Ez!s~!dnx6 zM>P6PJklS)L#;v_U}Ze|B7hyuZhmU zmvhgYBRcCpiO&8nqI3S6=-l5BZMn*&^R9O3{I|KZ_3bWQaE(i^eTPfi-s#fzYhBuL zol6&9@6ts#xODN2E?shyOPAj4(q*@}l)2TVtf&y19c z`;bXJf~NALu1w~>0i_5+b;IjWYTn>B?mn*zuT&HJuc5k*kS{k3OzyL?{)9h{3 zr9%W2&Xd$t;k2`o8Ovv}Rg*7!YrCdqD(t(1nq8FFt|-7mu=zKQ1aNR{x>AJQuJuM{ zCMO1`@>9jqfwisW@tuW1WY%lD1KfkMiba>TZ58CIgB%jpc40Z4N30#q56XIZZTr;B zB*HLn0j+g+j;`f6jy~nJT_OB~#p#N3QbK*`JSF79ZCj4c%^=2uJzT1)7#v-n%MA^0 O*l--LvX7g}PX7=3u=m^m literal 0 HcmV?d00001 diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm.map new file mode 100644 index 00000000..80e04ee6 --- /dev/null +++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm.map @@ -0,0 +1 @@ +{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* JIT compilation hook *)\n(* *)\n(* On first call to a named lambda, try to compile it to bytecode via *)\n(* compiler.sx (loaded as an .sx platform file). Compiled closures run *)\n(* on the bytecode VM; failures fall back to the CEK interpreter. *)\n(* ================================================================== *)\n\nlet _jit_compiling = ref false\n\nlet () =\n (* Convert int-keyed env.bindings to string-keyed Hashtbl for VM globals *)\n let env_to_vm_globals env =\n let g = Hashtbl.create (Hashtbl.length env.bindings) in\n Hashtbl.iter (fun id v -> Hashtbl.replace g (unintern id) v) env.bindings;\n g\n in\n Sx_ref.jit_call_hook := Some (fun f args ->\n match f with\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (Sx_vm.is_jit_failed cl) ->\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | Some _ -> None\n | None ->\n if !_jit_compiling then None\n else begin\n _jit_compiling := true;\n let compiled = Sx_vm.jit_compile_lambda l (env_to_vm_globals global_env) in\n _jit_compiling := false;\n match compiled with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | None -> None\n end)\n | _ -> None)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]} diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e14a0d8b28d6af3c7ade4b4446c2bbc01c2246c4 GIT binary patch literal 39400 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 v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil);\n ()\n\n(* ================================================================== *)\n(* JIT compilation hook *)\n(* *)\n(* On first call to a named lambda, try to compile it to bytecode via *)\n(* compiler.sx (loaded as an .sx platform file). Compiled closures run *)\n(* on the bytecode VM; failures fall back to the CEK interpreter. *)\n(* ================================================================== *)\n\nlet _jit_compiling = ref false\nlet _jit_enabled = ref false\n\nlet () =\n (* Convert int-keyed env.bindings to string-keyed Hashtbl for VM globals *)\n let env_to_vm_globals env =\n let g = Hashtbl.create (Hashtbl.length env.bindings) in\n Hashtbl.iter (fun id v -> Hashtbl.replace g (unintern id) v) env.bindings;\n g\n in\n Sx_ref.jit_call_hook := Some (fun f args ->\n match f with\n | Lambda l when !_jit_enabled ->\n (match l.l_compiled with\n | Some cl when not (Sx_vm.is_jit_failed cl) ->\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with e ->\n let fn_name = match l.l_name with Some n -> n | None -> \"?\" in\n Printf.eprintf \"[jit] DISABLED %s — %s\\n%!\" fn_name (Printexc.to_string e);\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | Some _ -> None\n | None ->\n if !_jit_compiling then None\n else begin\n _jit_compiling := true;\n let globals = env_to_vm_globals global_env in\n let compiled = Sx_vm.jit_compile_lambda l globals in\n _jit_compiling := false;\n let fn_name = match l.l_name with Some n -> n | None -> \"?\" in\n (match compiled with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try Some (Sx_vm.call_closure cl args cl.vm_env_ref)\n with e ->\n Printf.eprintf \"[jit] DISABLED %s — %s\\n%!\" fn_name (Printexc.to_string e);\n l.l_compiled <- Some Sx_vm.jit_failed_sentinel;\n None)\n | None ->\n Printf.eprintf \"[jit] FAIL %s\\n%!\" fn_name;\n None)\n end)\n | _ -> None)\n\nlet () = ignore (env_bind global_env \"enable-jit!\" (NativeFn (\"enable-jit!\", fun _ -> _jit_enabled := true; Nil)))\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]} diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/start-29cf9a72.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/start-29cf9a72.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c721405fb16b01c1b06628d4519817fa9eb386a5 GIT binary patch literal 1664 zcmZ{kOH&g;5XWZ|5g|aDH@4sd-y*2N@=l;Ap;RnVo`=b15=QqCXD2b?gk|Z$gP#2Y z9{eia{5oEoO)3Mu;ANBQUr#^&)6+~Op~o2Wz8xPQv-|<`YT*H62VSkoa=*V?TWM%- zQ-r~M`caXQIugNltV3beRHO`JeZF*-mqnudgm}%K_Ie?Xx`g6ZE0Ubcj{Q_RysG05 ziPXepVK?D%oyWedhVz}U8Eaa{3~|_{=_hxSIOe()85K$rclk8oe82C)+fpYgj)?1c z#nfz#ismg?YoMycbEA?zauFp2ProX1r>bGkvOU;lNH1Dv85U^p^}`iI24MC=qlX~;>;w$Amet6o|zed z=OQ^Y)qr#`KY%+C_YXxBNy=T+orqTHDzRX_L}H#s&z=(G1UoatCq!lRaN%CIjO>tb zPUTm^sJ684j9^#%UiB>jPU5}hnX7R({#vK+wnK-^o$S&2`BC>pREtBxTqza#o&XoH zVr;$!VJC;WbSj-BZ|t4X!JDufpeb~A0ZgT4twKAB?aYW5EYgy;l19-os%0KZF*TpF z2F9&D@#7|44yo02o0)W@*4n1xj5W0kTD8IHyo}l-y-k(QKg;DmrAs!)yo(>xKWzAW z`r{RNx=57>)RAQCBcFT5Jo8GUzpNk2{YbwI9wT@NBM5g8t|1fC7GWM?3SkW4Cc+#-5n&DCKEgwU z2MCW4RuS$YtRM^{Ttv8lFocjtxP%+*?_%Lgua!R~cv2|z+hRXcQ_%?BkcQW#FfA>U U+)B}2j{var +({"link":[["runtime-0db9b496",0],["prelude-d7e4b000",0],["stdlib-23ce0836",[]],["sx-ea36a0db",[2]],["jsoo_runtime-f96b44a8",[2]],["js_of_ocaml-651f6707",[2,4]],["dune__exe__Sx_browser-cafa954c",[2,3,5]],["std_exit-10fb8830",[2]],["start-29cf9a72",0]],"generated":(b=>{var c=b,a=b?.module?.export||b;return{"env":{"caml_ba_kind_of_typed_array":()=>{throw new Error("caml_ba_kind_of_typed_array not implemented")},"caml_exn_with_js_backtrace":()=>{throw new Error("caml_exn_with_js_backtrace not implemented")},"caml_int64_create_lo_mi_hi":()=>{throw new