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:
@@ -207,3 +207,57 @@
|
||||
((final (cek-resume state 41)))
|
||||
(assert (cek-terminal? final))
|
||||
(assert= (cek-value final) 42)))))
|
||||
|
||||
(defsuite
|
||||
"vm-import-suspension"
|
||||
(deftest
|
||||
"vm-execute-module runs trivial bytecode"
|
||||
(let
|
||||
((globals (dict)) (code (compile-module (quote (42)))))
|
||||
(assert= (vm-execute-module code globals) 42)))
|
||||
(deftest
|
||||
"vm-execute-module converts code-from-value internally"
|
||||
(let
|
||||
((globals (dict))
|
||||
(code (compile-module (quote ((define x 99) x)))))
|
||||
(assert= (vm-execute-module code globals) 99)))
|
||||
(deftest
|
||||
"compile-module handles import form"
|
||||
(let
|
||||
((code (compile-module (quote ((import (test lib)))))))
|
||||
(assert (dict? code))
|
||||
(assert (not (nil? (get code :bytecode))))))
|
||||
(deftest
|
||||
"vm-execute-module returns suspension dict on import"
|
||||
(let
|
||||
((globals (dict))
|
||||
(code (compile-module (quote ((import (test lib)))))))
|
||||
(let
|
||||
((result (vm-execute-module code globals)))
|
||||
(assert (dict? result) "result should be a dict")
|
||||
(assert= (get result :suspended) true)
|
||||
(assert= (get result :op) "import"))))
|
||||
(deftest
|
||||
"vm-resume-module continues after suspension"
|
||||
(let
|
||||
((globals (dict))
|
||||
(code
|
||||
(compile-module (quote ((import (test lib)) (define x 42) x)))))
|
||||
(let
|
||||
((r1 (vm-execute-module code globals)))
|
||||
(assert= (get r1 :suspended) true)
|
||||
(let ((r2 (vm-resume-module r1))) (assert= r2 42)))))
|
||||
(deftest
|
||||
"vm multiple sequential imports suspend and resume"
|
||||
(let
|
||||
((globals (dict))
|
||||
(code
|
||||
(compile-module
|
||||
(quote ((import (test a)) (import (test b)) (define x 99) x)))))
|
||||
(let
|
||||
((r1 (vm-execute-module code globals)))
|
||||
(assert= (get r1 :suspended) true)
|
||||
(let
|
||||
((r2 (vm-resume-module r1)))
|
||||
(assert= (get r2 :suspended) true)
|
||||
(let ((r3 (vm-resume-module r2))) (assert= r3 99)))))))
|
||||
|
||||
Reference in New Issue
Block a user