Stub VM uses real globals for CEK resume after IO suspension
The _cek_io_suspend_hook creates a stub VM to carry the suspended CEK state. Previously used empty globals, which caused "Not callable: nil" when the CEK resume needed platform functions. Now uses _default_vm_globals (set to _vm_globals by sx_browser.ml) so all platform functions and definitions are available during resume. Remaining issue: still getting "resume: Not callable: nil" — the CEK continuation env may not include letrec bindings from the island body. The suspension point is inside reload-frame → hs-wait, and the resume needs to call wait-boot (a letrec binding). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -237,6 +237,7 @@ let return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =
|
||||
VmClosures from bytecode modules hold vm_env_ref pointing here.
|
||||
Must stay in sync so VmClosures see post-boot definitions. *)
|
||||
let _vm_globals : (string, value) Hashtbl.t = Hashtbl.create 512
|
||||
let () = Sx_types._default_vm_globals := _vm_globals
|
||||
let _in_batch = ref false
|
||||
|
||||
(* Sync env→VM: copy all bindings from global_env.bindings to _vm_globals.
|
||||
|
||||
@@ -258,6 +258,10 @@ let _cek_io_resolver : (value -> value -> value) option ref = ref None
|
||||
to convert CEK suspensions to VmSuspended for _driveAsync handling. *)
|
||||
let _cek_io_suspend_hook : (value -> value) option ref = ref None
|
||||
|
||||
(** Default VM globals for stub VMs created during IO suspension.
|
||||
Set by sx_browser.ml to _vm_globals so CEK resume can access platform functions. *)
|
||||
let _default_vm_globals : (string, value) Hashtbl.t ref = ref (Hashtbl.create 0)
|
||||
|
||||
(** Hook: convert VM suspension exceptions to CekPerformRequest.
|
||||
Set by sx_vm after it defines VmSuspended. Called by sx_runtime.sx_apply_cek. *)
|
||||
let _convert_vm_suspension : (exn -> unit) ref = ref (fun _ -> ())
|
||||
|
||||
@@ -1027,7 +1027,7 @@ let () = _vm_suspension_to_dict := (fun exn ->
|
||||
gets swallowed as "IO suspension in non-IO context". *)
|
||||
let () = _cek_io_suspend_hook := Some (fun suspended_state ->
|
||||
let request = Sx_ref.cek_io_request suspended_state in
|
||||
let vm = create (Hashtbl.create 0) in
|
||||
let vm = create !_default_vm_globals in
|
||||
vm.pending_cek <- Some suspended_state;
|
||||
raise (VmSuspended (request, vm)))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user