Fix WASM stack overflow: make cek_run iterative
The CEK evaluator's cek_run was recursive (calls itself via cek_step). Native OCaml handles deep recursion but wasm_of_ocaml compiles to JS which has ~10K frame stack limit. Complex expressions (bytecode compiler) exceeded this, causing "Maximum call stack size exceeded" in all WASM bytecode compilation. Replace recursive cek_run with iterative while loop — same semantics, zero stack growth. Fixes sx_build_bytecode and browser-side evaluation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user