vm-ext: phase B — extension registry module
sx_vm_extension.ml: handler type, extensible extension_state variant, EXTENSION first-class module signature. sx_vm_extensions.ml: register / dispatch / id_of_name / state_of_extension. install_dispatch () runs at module init, swapping Phase A's stub for the real registry. Rejects out-of-range opcode IDs (must be 200-247), duplicate IDs, duplicate names, and duplicate extension names. Tests: 9 new foundation cases — lookup hits/misses, end-to-end VM dispatch including opcode composition, all four rejection paths. +9 pass vs Phase A baseline, no regressions across 11 conformance suites.
This commit is contained in:
@@ -258,10 +258,10 @@ Five sub-phases in dependency order. Each is testable in isolation.
|
||||
opcodes yet. Phase B's module init installs the real `dispatch` into
|
||||
`Sx_vm.extension_dispatch_ref`, replacing Phase A's stub.
|
||||
|
||||
- [ ] `Sx_vm_extension` interface module (handler type, EXTENSION sig).
|
||||
- [ ] `Sx_vm_extensions` registry module (`register`, `dispatch`,
|
||||
- [x] `Sx_vm_extension` interface module (handler type, EXTENSION sig).
|
||||
- [x] `Sx_vm_extensions` registry module (`register`, `dispatch`,
|
||||
`id_of_name`, `state_of_extension`).
|
||||
- [ ] Wire the registry's `dispatch` into `Sx_vm.extension_dispatch_ref` at
|
||||
- [x] Wire the registry's `dispatch` into `Sx_vm.extension_dispatch_ref` at
|
||||
module init.
|
||||
|
||||
**Tests:**
|
||||
@@ -457,6 +457,24 @@ familiarity.
|
||||
|
||||
Newest first.
|
||||
|
||||
- **2026-05-14** — Phase B done. Added `hosts/ocaml/lib/sx_vm_extension.ml`
|
||||
(interface: `handler` type, `extension_state` extensible variant,
|
||||
`EXTENSION` module type) and `sx_vm_extensions.ml` (registry: `register`,
|
||||
`dispatch`, `id_of_name`, `state_of_extension`, `_reset_for_tests`).
|
||||
`let () = install_dispatch ()` at module init replaces Phase A's stub
|
||||
with the real registry dispatch — Phase A behavior preserved (empty
|
||||
registry still raises `Invalid_opcode` for unregistered ops). Registry
|
||||
rejects opcode IDs outside 200-247, duplicate IDs, duplicate names, and
|
||||
duplicate extension names. 9 new foundation tests (`vm-extension-registry`
|
||||
suite): id_of_name resolve+miss, state_of_extension resolve+miss,
|
||||
end-to-end VM dispatch (push 42), opcode composition (push 42 → double
|
||||
→ 84), duplicate-id / out-of-range / duplicate-name rejection. +9 pass
|
||||
vs Phase A baseline (4816 vs 4807), 1111 pre-existing failures unchanged.
|
||||
Conformance suites green: erlang 530/530, haskell 285/285, datalog
|
||||
276/276, prolog 590/590, smalltalk 847/847, common-lisp 487/487, apl
|
||||
562/562, js 148/148, forth 632/638 (pre-existing), tcl 3/4 (pre-existing),
|
||||
ocaml-on-sx unit 607/607.
|
||||
|
||||
- **2026-05-14** — Phase A done. Added `Invalid_opcode of int` exception,
|
||||
`extension_dispatch_ref` (default raises `Invalid_opcode op`), and the
|
||||
`| op when op >= 200 -> !extension_dispatch_ref op vm frame` arm before the
|
||||
|
||||
Reference in New Issue
Block a user