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 *)
|
(* cek-run *)
|
||||||
and cek_run state =
|
and cek_run state =
|
||||||
(if sx_truthy ((cek_terminal_p (state))) then (cek_value (state)) else
|
(* Iterative loop — no stack growth. Essential for WASM where JS stack is limited. *)
|
||||||
try cek_run ((cek_step (state)))
|
let s = ref state in
|
||||||
with Eval_error msg ->
|
(try
|
||||||
(if !_last_error_kont = Nil then _last_error_kont := cek_kont state);
|
while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do
|
||||||
raise (Eval_error msg))
|
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 *)
|
(* cek-step *)
|
||||||
and cek_step state =
|
and cek_step state =
|
||||||
|
|||||||
Reference in New Issue
Block a user