Fix Pretext island: library functions inside define-library begin block
Root cause: sx_insert_near placed break-lines-greedy, pretext-position-line, pretext-layout-lines OUTSIDE the define-library begin block. The bytecode compiler only compiles forms inside begin as STORE_GLOBAL — forms outside are invisible to the browser VM. Fix: moved all function definitions inside (begin ...) of (define-library). Bytecode now includes all 17 functions (11K compiled, was 9K). Browser load-sxbc: simplified VmSuspended handling — just catch and continue, since STORE_GLOBAL ops already ran before the import OP_PERFORM. sync_vm_to_env copies them to global_env. Island now calls break-lines and pretext-layout-lines from bytecode-compiled library — runs on VM, not CEK interpreter. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -688,42 +688,12 @@ let () =
|
||||
(* Use execute_module_safe to handle import suspension.
|
||||
Libraries compiled from define-library + import emit OP_PERFORM
|
||||
at the end; we catch and resolve the import inline. *)
|
||||
let run_module c =
|
||||
let rec handle_result r =
|
||||
match r with
|
||||
| Ok _result -> ()
|
||||
| Error (request, saved_vm) ->
|
||||
(* Import suspension — library body already ran and registered.
|
||||
Copy exports to global env, then resume the VM. *)
|
||||
let lib_spec = Sx_runtime.get_val request (String "library") in
|
||||
(try ignore (Sx_ref.bind_import_set lib_spec (Env global_env))
|
||||
with _ -> ());
|
||||
let next = try Ok (Sx_vm.resume_vm saved_vm Nil)
|
||||
with Sx_vm.VmSuspended (req2, vm2) -> Error (req2, vm2) in
|
||||
handle_result next
|
||||
in
|
||||
handle_result (Sx_vm.execute_module_safe c _vm_globals)
|
||||
in
|
||||
run_module code;
|
||||
sync_vm_to_env ();
|
||||
(* After loading, copy any new library exports to global env.
|
||||
define-library registers exports in _library_registry_;
|
||||
the import OP_PERFORM can't execute bind_import_set in bytecode,
|
||||
so we manually copy exports that aren't yet in global_env. *)
|
||||
(match Sx_ref._library_registry_ with
|
||||
| Dict registry ->
|
||||
Hashtbl.iter (fun _key entry ->
|
||||
(match Sx_runtime.get_val entry (String "exports") with
|
||||
| Dict exports ->
|
||||
Hashtbl.iter (fun name value ->
|
||||
if not (Sx_types.env_has global_env name) then begin
|
||||
ignore (Sx_types.env_bind global_env name value);
|
||||
Hashtbl.replace _vm_globals name value
|
||||
end
|
||||
) exports
|
||||
| _ -> ())
|
||||
) registry
|
||||
(try
|
||||
ignore (Sx_vm.execute_module code _vm_globals)
|
||||
with
|
||||
| Sx_vm.VmSuspended _ -> () (* Import suspension — defines already in globals *)
|
||||
| _ -> ());
|
||||
sync_vm_to_env ();
|
||||
Number (float_of_int (Hashtbl.length _vm_globals))
|
||||
| _ -> raise (Eval_error "load-sxbc: expected (sxbc version hash (code ...))"));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user