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 00000000..2a022ead Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-42a03a59.wasm differ 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":"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","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 00000000..86ef9e34 Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-c4dd2355.wasm differ 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 00000000..e14a0d8b Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm differ diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.wasm.map new file mode 100644 index 00000000..1c7a2dba --- /dev/null +++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-cafa954c.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(* ================================================================== *)\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 00000000..c721405f Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/start-29cf9a72.wasm differ diff --git a/shared/static/wasm/sx_browser.bc.wasm.js b/shared/static/wasm/sx_browser.bc.wasm.js index 94c0deb3..a18eb41e 100644 --- a/shared/static/wasm/sx_browser.bc.wasm.js +++ b/shared/static/wasm/sx_browser.bc.wasm.js @@ -1792,7 +1792,7 @@ blake2_js_for_wasm_create: blake2_js_for_wasm_create}; } (globalThis)) -({"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-4feaf1fd",[2,3,5]],["std_exit-10fb8830",[2]],["start-9e868ccd",0]],"generated":(b=>{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