diff --git a/hosts/ocaml/lib/sx_ref.ml b/hosts/ocaml/lib/sx_ref.ml index aedf1284..b187a008 100644 --- a/hosts/ocaml/lib/sx_ref.ml +++ b/hosts/ocaml/lib/sx_ref.ml @@ -374,11 +374,16 @@ and expand_macro mac raw_args env = (* cek-run *) and cek_run state = - (if sx_truthy ((cek_terminal_p (state))) then (cek_value (state)) else - try cek_run ((cek_step (state))) - with Eval_error msg -> - (if !_last_error_kont = Nil then _last_error_kont := cek_kont state); - raise (Eval_error msg)) + (* Iterative loop — no stack growth. Essential for WASM where JS stack is limited. *) + let s = ref state in + (try + while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do + s := cek_step !s + done; + cek_value !s + with Eval_error msg -> + (if !_last_error_kont = Nil then _last_error_kont := cek_kont !s); + raise (Eval_error msg)) (* cek-step *) and cek_step state =