Core SX has zero IO — platforms extend __io-registry via (defio name :category :data/:code/:effect ...). The server web platform declares 44 operations in web/io.sx. batchable_helpers now derived from registry (:batchable true) instead of hardcoded list. Startup validation warns if bound IO ops lack registry entries. Browser gets empty registry, ready for step 5 (IO suspension). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2 lines
60 KiB
Plaintext
2 lines
60 KiB
Plaintext
{"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 let result = Sx_runtime.sx_call fn args in\n !Sx_primitives._sx_trampoline_fn result\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\n | Eval_error msg ->\n let fn_info = Printf.sprintf \" [callback %s handle=%d]\" (type_of v) handle in\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 ^ fn_info)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n let fn_info = Printf.sprintf \" [callback %s handle=%d]\" (type_of v) handle in\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] UNCAUGHT: \" ^ Printexc.to_string exn ^ fn_info)) |]);\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(* Persistent VM globals — synced with global_env *)\n(* ================================================================== *)\n\n(* String-keyed mirror of global_env.bindings for VmClosures.\n VmClosures from bytecode modules hold vm_env_ref pointing here.\n Must stay in sync so VmClosures see post-boot definitions. *)\nlet _vm_globals : (string, value) Hashtbl.t = Hashtbl.create 512\nlet _in_batch = ref false\n\n(* Sync env→VM: copy all bindings from global_env.bindings to _vm_globals.\n Called after CEK eval/load so VmClosures can see new definitions. *)\nlet sync_env_to_vm () =\n Hashtbl.iter (fun id v ->\n Hashtbl.replace _vm_globals (unintern id) v\n ) global_env.bindings\n\n(* Hook: intercept env_bind on global_env to also update _vm_globals.\n Only sync bindings on the global env — let bindings in child envs\n must NOT leak into _vm_globals (they'd overwrite real definitions). *)\nlet () =\n Sx_types._env_bind_hook := Some (fun env name v ->\n if env == global_env then\n Hashtbl.replace _vm_globals name v)\n\n(* Reverse hook: sync VM GLOBAL_SET mutations back to global_env.\n Without this, set! inside JIT-compiled functions writes to _vm_globals\n but leaves global_env stale — CEK reads then see the old value. *)\nlet () =\n Sx_types._vm_global_set_hook := Some (fun name v ->\n Hashtbl.replace global_env.bindings (Sx_types.intern name) 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 sync_env_to_vm ();\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\n(** evalVM: compile SX source to bytecode and run through the VM.\n Globals defined with `define` are visible to subsequent evalVM/eval calls.\n This tests the exact same code path as island hydration and click handlers. *)\nlet api_eval_vm src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let compile_fn = match Hashtbl.find_opt _vm_globals \"compile-module\" with\n | Some v -> v\n | None -> env_get global_env \"compile-module\" in\n let code_val = Sx_ref.trampoline (Sx_runtime.sx_call compile_fn [List exprs]) in\n let code = Sx_vm.code_from_value code_val in\n let result = Sx_vm.execute_module code _vm_globals in\n (* Sync VM globals → CEK env so subsequent eval() calls see defines *)\n Hashtbl.iter (fun name v ->\n let id = intern name in\n if not (Hashtbl.mem global_env.bindings id) then\n Hashtbl.replace global_env.bindings id v\n else (match Hashtbl.find global_env.bindings id, v with\n | VmClosure _, VmClosure _ | _, VmClosure _ -> Hashtbl.replace global_env.bindings id v\n | _ -> ())\n ) _vm_globals;\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 | Not_found -> Js.Unsafe.inject (Js.string \"Error: compile-module not loaded\")\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n let result = Sx_ref.eval_expr expr (Env global_env) in\n sync_env_to_vm ();\n return_via_side_channel (value_to_js result)\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 sync_env_to_vm ();\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_begin_module_load () =\n (* Snapshot current env into the persistent VM globals table *)\n Hashtbl.clear _vm_globals;\n Hashtbl.iter (fun id v -> Hashtbl.replace _vm_globals (unintern id) v) global_env.bindings;\n _in_batch := true;\n Js.Unsafe.inject true\n\nlet api_end_module_load () =\n if !_in_batch then begin\n (* Copy VM globals back to env (bytecode modules defined new symbols) *)\n Hashtbl.iter (fun k v ->\n Hashtbl.replace global_env.bindings (intern k) v\n ) _vm_globals;\n _in_batch := false\n end;\n Js.Unsafe.inject true\n\nlet sync_vm_to_env () =\n Hashtbl.iter (fun name v ->\n let id = intern name in\n if not (Hashtbl.mem global_env.bindings id) then\n Hashtbl.replace global_env.bindings id v\n else begin\n (* Update existing binding if the VM has a newer value *)\n let existing = Hashtbl.find global_env.bindings id in\n match existing, v with\n | VmClosure _, VmClosure _ -> Hashtbl.replace global_env.bindings id v\n | _, VmClosure _ -> Hashtbl.replace global_env.bindings id v\n | _ -> ()\n end\n ) _vm_globals\n\nlet api_load_module module_js =\n try\n let code_val = js_to_value module_js in\n let code = Sx_vm.code_from_value code_val in\n let _result = Sx_vm.execute_module code _vm_globals in\n sync_vm_to_env ();\n Js.Unsafe.inject (Hashtbl.length _vm_globals)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | exn -> Js.Unsafe.inject (Js.string (\"Error: \" ^ Printexc.to_string exn))\n\nlet api_debug_env name_js =\n let name = Js.to_string name_js in\n let id = intern name in\n let found_env = Hashtbl.find_opt global_env.bindings id in\n let found_vm = Hashtbl.find_opt _vm_globals name in\n let total_env = Hashtbl.length global_env.bindings in\n let total_vm = Hashtbl.length _vm_globals in\n let env_s = match found_env with Some v -> \"env:\" ^ type_of v | None -> \"env:MISSING\" in\n let vm_s = match found_vm with Some v -> \"vm:\" ^ type_of v | None -> \"vm:MISSING\" in\n Js.Unsafe.inject (Js.string (Printf.sprintf \"%s %s (env=%d vm=%d)\" env_s vm_s total_env total_vm))\n\nlet api_compile_module src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let compile_fn = env_get global_env \"compile-module\" in\n let code = Sx_ref.eval_expr (List [compile_fn; List exprs]) (Env global_env) in\n return_via_side_channel (value_to_js code)\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 | Not_found -> Js.Unsafe.inject (Js.string \"Error: compile-module not loaded\")\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.sx_render_to_html global_env 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 let v = NativeFn (name, native_fn) in\n Sx_primitives.register name native_fn;\n ignore (env_bind global_env name v);\n Hashtbl.replace _vm_globals name v;\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 (* client? returns true in browser — set the ref so the primitive returns true *)\n Sx_primitives._is_client := true;\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; a] when is_callable f ->\n let arg_list = match a with List l -> l | Nil -> [] | v -> [v] in\n Sx_ref.trampoline (Sx_runtime.sx_call f arg_list)\n | [f; _] -> raise (Eval_error (\"cek-call: not callable: \" ^ type_of f))\n | _ -> raise (Eval_error \"cek-call: expected (fn 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 (* parse: same as server — unwraps single results, returns list for multiple.\n Used by boot.sx (page scripts, suspense) and engine.sx (marsh update). *)\n bind \"parse\" (fun args ->\n match args with\n | [String src] | [SxExpr src] ->\n let exprs = Sx_parser.parse_all src in\n (match exprs with [e] -> e | _ -> List exprs)\n | [v] -> v\n | _ -> raise (Eval_error \"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 (* --- Bytecode loading from s-expression format ---\n (sxbc version hash (code :arity N :upvalue-count N :bytecode (...) :constants (...)))\n Recursively converts the SX tree into the dict format that loadModule expects. *)\n bind \"load-sxbc\" (fun args ->\n match args with\n | [List (_ :: _ :: _ :: code_form :: _)] | [List (_ :: _ :: code_form :: _)] ->\n let rec convert_code form =\n match form with\n | List (Symbol \"code\" :: rest) ->\n let d = Hashtbl.create 8 in\n let rec parse_kv = function\n | Keyword \"arity\" :: Number n :: rest -> Hashtbl.replace d \"arity\" (Number n); parse_kv rest\n | Keyword \"upvalue-count\" :: Number n :: rest -> Hashtbl.replace d \"upvalue-count\" (Number n); parse_kv rest\n | Keyword \"bytecode\" :: List nums :: rest ->\n Hashtbl.replace d \"bytecode\" (List nums); parse_kv rest\n | Keyword \"constants\" :: List consts :: rest ->\n Hashtbl.replace d \"constants\" (List (List.map convert_const consts)); parse_kv rest\n | _ :: rest -> parse_kv rest (* skip unknown keywords *)\n | [] -> ()\n in\n parse_kv rest;\n Dict d\n | _ -> raise (Eval_error (\"load-sxbc: expected (code ...), got \" ^ type_of form))\n and convert_const = function\n | List (Symbol \"code\" :: _) as form -> convert_code form\n | List (Symbol \"list\" :: items) -> List (List.map convert_const items)\n | v -> v (* strings, numbers, booleans, nil, symbols, keywords pass through *)\n in\n let module_val = convert_code code_form in\n let code = Sx_vm.code_from_value module_val in\n let _result = Sx_vm.execute_module code _vm_globals in\n sync_vm_to_env ();\n Number (float_of_int (Hashtbl.length _vm_globals))\n | _ -> raise (Eval_error \"load-sxbc: expected (sxbc version hash (code ...))\"));\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!: expected list and value\"));\n\n (* remove! — mutate ListRef in-place, removing by identity (==) *)\n bind \"remove!\" (fun args ->\n match args with\n | [ListRef r; target] ->\n r := List.filter (fun x -> x != target) !r; ListRef r\n | [List items; target] ->\n List (List.filter (fun x -> x != target) items)\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 (* Runtime helpers for bytecoded defcomp/defisland/defmacro forms.\n The compiler emits GLOBAL_GET \"eval-defcomp\" + CALL — these must\n exist as callable values for bytecoded .sx files that contain\n component definitions (e.g. cssx.sx). *)\n bind \"eval-defcomp\" (fun args ->\n match args with [List (_ :: rest)] -> Sx_ref.sf_defcomp (List rest) (Env global_env) | _ -> Nil);\n bind \"eval-defisland\" (fun args ->\n match args with [List (_ :: rest)] -> Sx_ref.sf_defisland (List rest) (Env global_env) | _ -> Nil);\n bind \"eval-defmacro\" (fun args ->\n match args with [List (_ :: rest)] -> Sx_ref.sf_defmacro (List rest) (Env global_env) | _ -> Nil);\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.sx_render_to_html global_env 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 (* IO registry — starts empty in browser. Platforms extend via defio.\n Browser has zero suspension points initially; future browser IO\n (lazy module loads, fetch-request) will add entries here. *)\n let io_registry = Hashtbl.create 16 in\n ignore (env_bind global_env \"__io-registry\" (Dict io_registry));\n ignore (Sx_ref.register_special_form (String \"defio\") (NativeFn (\"defio\", fun sf_args ->\n let raw_args = match sf_args with\n | [List a; Env _] | [ListRef { contents = a }; Env _] -> a\n | _ -> [] in\n match raw_args with\n | String name :: rest ->\n let entry = Hashtbl.create 8 in\n let rec parse = function\n | Keyword k :: v :: rest -> Hashtbl.replace entry k v; parse rest\n | _ -> () in\n parse rest;\n Hashtbl.replace entry \"name\" (String name);\n Hashtbl.replace io_registry name (Dict entry);\n Dict entry\n | _ -> 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 (* --- HTML tag special forms (div, span, h1, ...) --- *)\n (* Registered as custom special forms so keywords are preserved.\n Handler receives (raw-args env), evaluates non-keyword args\n while keeping keyword names intact. *)\n let eval_tag_args raw_args env =\n let args = Sx_runtime.sx_to_list raw_args in\n let rec process = function\n | [] -> []\n | (Keyword _ as kw) :: value :: rest ->\n (* keyword + its value: keep keyword, evaluate value *)\n kw :: Sx_ref.eval_expr value env :: process rest\n | (Keyword _ as kw) :: [] ->\n (* trailing keyword with no value — boolean attr *)\n [kw]\n | expr :: rest ->\n (* non-keyword: evaluate *)\n Sx_ref.eval_expr expr env :: process rest\n in\n process args\n in\n List.iter (fun tag ->\n ignore (Sx_ref.register_special_form (String tag)\n (NativeFn (\"sf:\" ^ tag, fun handler_args ->\n match handler_args with\n | [raw_args; env] -> List (Symbol tag :: eval_tag_args raw_args env)\n | _ -> Nil)))\n ) Sx_render.html_tags;\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 | [f; a; _] | [f; a] when is_callable f ->\n (* Use cek_call instead of sx_call to avoid eval_expr copying\n Dict values (signals). sx_call returns a Thunk resolved via\n eval_expr which deep-copies dicts, breaking signal mutation. *)\n Sx_ref.cek_call f a\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with\n | [f; a] when is_callable f ->\n let arg_list = match a with List l -> l | Nil -> [] | v -> [v] in\n Sx_ref.trampoline (Sx_runtime.sx_call f arg_list)\n | [f; _] -> raise (Eval_error (\"cek-call: not callable: \" ^ type_of f))\n | _ -> raise (Eval_error \"cek-call: expected (fn args)\"));\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 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 _vm_globals)\n with Eval_error msg ->\n let fn_name = match l.l_name with Some n -> n | None -> \"?\" in\n Printf.eprintf \"[jit] FAIL %s: %s (bc=%d consts=%d upv=%d)\\n%!\"\n fn_name msg\n (Array.length cl.vm_code.vc_bytecode)\n (Array.length cl.vm_code.vc_constants)\n (Array.length cl.vm_upvalues);\n (* Mark as failed to stop retrying *)\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 _vm_globals 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 _vm_globals)\n with Eval_error msg ->\n let fn_name2 = match l.l_name with Some n -> n | None -> \"?\" in\n Printf.eprintf \"[jit] FAIL %s: %s (bc=%d consts=%d upv=%d)\\n%!\"\n fn_name2 msg\n (Array.length cl.vm_code.vc_bytecode)\n (Array.length cl.vm_code.vc_constants)\n (Array.length cl.vm_upvalues);\n l.l_compiled <- Some (Sx_vm.jit_failed_sentinel);\n None)\n | None -> None)\n end)\n | _ -> None)\n\nlet () = ignore (env_bind global_env \"enable-jit!\" (NativeFn (\"enable-jit!\", fun _ -> _jit_enabled := true; Nil)))\n\n(* Seed BOTH _vm_globals AND global_env with ALL primitives as NativeFn values.\n Unconditional — native primitives are authoritative for CALL_PRIM dispatch.\n Must be in both because sync_env_to_vm() copies global_env → _vm_globals. *)\nlet () =\n Hashtbl.iter (fun name fn ->\n let v = NativeFn (name, fn) in\n Hashtbl.replace _vm_globals name v;\n Hashtbl.replace global_env.bindings (intern name) v\n ) Sx_primitives.primitives\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 \"evalVM\") (wrap api_eval_vm);\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 \"loadModule\") (Js.wrap_callback api_load_module);\n Js.Unsafe.set sx (Js.string \"beginModuleLoad\") (Js.wrap_callback (fun () -> api_begin_module_load ()));\n Js.Unsafe.set sx (Js.string \"endModuleLoad\") (Js.wrap_callback (fun () -> api_end_module_load ()));\n Js.Unsafe.set sx (Js.string \"compileModule\") (wrap api_compile_module);\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 Js.Unsafe.set sx (Js.string \"debugEnv\") (Js.wrap_callback api_debug_env);\n\n (* Scope tracing API *)\n Js.Unsafe.set sx (Js.string \"scopeTraceOn\") (Js.wrap_callback (fun () ->\n Sx_scope.scope_trace_enable (); Js.Unsafe.inject Js.null));\n Js.Unsafe.set sx (Js.string \"scopeTraceOff\") (Js.wrap_callback (fun () ->\n Sx_scope.scope_trace_disable (); Js.Unsafe.inject Js.null));\n Js.Unsafe.set sx (Js.string \"scopeTraceDrain\") (Js.wrap_callback (fun () ->\n let log = Sx_scope.scope_trace_drain () in\n Js.Unsafe.inject (Js.array (Array.of_list (List.map (fun s -> Js.Unsafe.inject (Js.string s)) log)))));\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
|