From 92a59eba9d9d62cbef73007b74f6219dc546f576 Mon Sep 17 00:00:00 2001 From: giles Date: Thu, 2 Apr 2026 11:03:17 +0000 Subject: [PATCH] Fix vm_globals seeding: run after make_server_env to avoid HO wrapper conflict Move primitive seeding to end of make_server_env() so ho_via_cek wrappers (map, filter, etc.) are already in vm_globals. The seeding only adds primitives NOT already present, preserving wrappers. Co-Authored-By: Claude Opus 4.6 (1M context) --- hosts/ocaml/bin/sx_server.ml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/hosts/ocaml/bin/sx_server.ml b/hosts/ocaml/bin/sx_server.ml index c816d60d..711fad84 100644 --- a/hosts/ocaml/bin/sx_server.ml +++ b/hosts/ocaml/bin/sx_server.ml @@ -680,14 +680,6 @@ let () = if env.parent = None then Hashtbl.replace _shared_vm_globals name v) -(* Seed _shared_vm_globals with all primitives as NativeFn values. - Makes vm_globals the single source of truth for CALL_PRIM dispatch. *) -let () = - Hashtbl.iter (fun name fn -> - if not (Hashtbl.mem _shared_vm_globals name) then - Hashtbl.replace _shared_vm_globals name (NativeFn (name, fn)) - ) Sx_primitives.primitives - let make_server_env () = let env = make_env () in Sx_render.setup_render_env env; @@ -743,6 +735,12 @@ let make_server_env () = | other -> other); (* client? returns false on server — overridden in browser via K.eval *) ignore (env_bind env "client?" (NativeFn ("client?", fun _ -> Bool false))); + (* Seed vm_globals with any primitives not already there. + Must run AFTER all bind/ho_via_cek calls so wrappers take precedence. *) + Hashtbl.iter (fun name fn -> + if not (Hashtbl.mem _shared_vm_globals name) then + Hashtbl.replace _shared_vm_globals name (NativeFn (name, fn)) + ) Sx_primitives.primitives; env