Unify CALL_PRIM dispatch: vm_globals as single source of truth

Seed all primitives into vm_globals as NativeFn values at init.
CALL_PRIM now looks up vm.globals only (not the separate primitives
table). This means OP_DEFINE and registerNative naturally override
primitives — browser.sx's (define set-cookie ...) now takes effect.

The primitives Hashtbl remains for the compiler's primitive? predicate
but has no runtime dispatch role.

Tests: 2435 pass / 64 fail (pre-existing), vs 1718/771 baseline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 10:53:09 +00:00
parent 3aa6695c69
commit c430ef8110
3 changed files with 21 additions and 5 deletions

View File

@@ -857,6 +857,15 @@ let () =
let () = ignore (env_bind global_env "enable-jit!" (NativeFn ("enable-jit!", fun _ -> _jit_enabled := true; Nil)))
(* Seed _vm_globals with all primitives as NativeFn values.
This makes _vm_globals the single source of truth for CALL_PRIM dispatch.
OP_DEFINE and registerNative naturally override entries here. *)
let () =
Hashtbl.iter (fun name fn ->
if not (Hashtbl.mem _vm_globals name) then
Hashtbl.replace _vm_globals name (NativeFn (name, fn))
) Sx_primitives.primitives
(* ================================================================== *)
(* Register global SxKernel object *)
(* ================================================================== *)