VM import suspension for browser lazy loading
Bytecode compiler now emits OP_PERFORM for (import ...) and compiles
(define-library ...) bodies. The VM stores the import request in
globals["__io_request"] and stops the run loop — no exceptions needed.
vm-execute-module returns a suspension dict, vm-resume-module continues.
Browser: sx_browser.ml detects suspension dicts from execute_module and
returns JS {suspended, op, request, resume} objects. The sx-platform.js
while loop handles cascading suspensions via handleImportSuspension.
13 modules load via .sxbc bytecode in 226ms (manifest-driven), both
islands hydrate, all handlers wired. 2650/2650 tests pass including
6 new vm-import-suspension tests.
Also: consolidated sx-platform-2.js → sx-platform.js, fixed
vm-execute-module missing code-from-value call, fixed bootstrap.py
protocol registry transpiler issues.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -598,6 +598,16 @@ let execute_module code globals =
|
||||
run vm;
|
||||
pop vm
|
||||
|
||||
(** Execute module, catching VmSuspended locally (same compilation unit).
|
||||
Returns [Ok result] or [Error (request, vm)] for import suspension.
|
||||
Needed because js_of_ocaml can't catch exceptions across module boundaries. *)
|
||||
let execute_module_safe code globals =
|
||||
try
|
||||
let result = execute_module code globals in
|
||||
Ok result
|
||||
with VmSuspended (request, vm) ->
|
||||
Error (request, vm)
|
||||
|
||||
|
||||
(** {1 Lazy JIT compilation} *)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user