Merge pull request #26 from jolt-lang/stage2-freeze-punt-set

Freeze the punt set: fallback-zero asserts the exhaustive fallback surface
This commit is contained in:
Dmitri Sotnikov 2026-06-10 21:54:47 +08:00 committed by GitHub
commit c14c129627
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -72,12 +72,32 @@
"(defonce fz-once 1)" "(read-string \"[1 2]\")" "(defonce fz-once 1)" "(read-string \"[1 2]\")"
"(macroexpand-1 (quote (when true 1)))"]) "(macroexpand-1 (quote (when true 1)))"])
# --- Intentional fallback (sanity sample): these SHOULD punt to the interpreter. # --- THE FROZEN PUNT SET (Stage 2 complete) ---------------------------------
# The remaining frozen/uncompiled set keeps the harness honest in the punt # These are the ONLY heads that may reach the interpreter, exhaustively:
# direction: defmacro + set! (frozen host-coupled), and letfn (needs letrec IR). # defmacro — definitional host seam (the EXPANDERS are compiled;
# see backend/recompile-macros!)
# set! — host var-cell mutation special
# letfn — needs letrec IR (sequential let* can't express mutual
# recursion); permanent-interpret unless the IR gains it
# eval — compile-and-run entry (also loader stateful-head?)
# . / new / Foo. / — thin host-interop heads the back end doesn't model
# .method
# gen-class, monitor-enter, monitor-exit — JVM-compat stubs
# Growing this list is a REGRESSION: a new punt means the compiler lost
# coverage. Shrinking it (e.g. letfn via letrec IR) is progress — move the
# form to must-compile.
(def must-punt (def must-punt
["(defmacro m [x] x)" ["(defmacro m [x] x)"
"(set! *warn-on-reflection* true)" "(letfn [(f [n] (g n)) (g [n] (f n))] (f 1))"]) "(set! *warn-on-reflection* true)"
"(letfn [(f [n] (g n)) (g [n] (f n))] (f 1))"
"(eval (quote (+ 1 2)))"
"(.method obj)"
"(.-field obj)"
"(new Foo 1)"
"(Foo. 1)"
"(gen-class :name X)"
"(monitor-enter x)"
"(monitor-exit x)"])
(var fails @[]) (var fails @[])
(each s must-compile (each s must-compile