embed a namespace value spliced into a form (~*ns*)
A macro like (defmacro cur-ns [] `(str ~*ns*)) splices the live *ns* value into its expansion, leaving an opaque jns object as a list element. The analyzer had no way to carry a runtime value and threw uncompilable — the last remaining corpus crash. Recognize a jns via the host contract (form-ns-value?) and emit a :the-ns leaf that reconstructs it by name (intern-ns!) at the call site, the same IR-leaf pattern as regex/inst/uuid. Closes unquote-*ns*-in- template; corpus crash count -> 0. A namespace fast path rather than a general constant pool: it's the only embedded-value case in the corpus and the common real-world one (libs splice ~*ns*). A general pool can come later if other value types appear.
This commit is contained in:
parent
ccc76fd69f
commit
8ce00d29fd
5 changed files with 17 additions and 4 deletions
|
|
@ -23,6 +23,7 @@
|
|||
form-map-pairs form-set-items form-special? compile-ns
|
||||
form-regex? form-regex-source
|
||||
form-inst? form-inst-source form-uuid? form-uuid-source
|
||||
form-ns-value? form-ns-value-name
|
||||
form-macro? form-expand-1 resolve-global
|
||||
form-sym-meta host-intern! form-syntax-quote-lower
|
||||
record-type? record-ctor-key form-position late-bind?]]))
|
||||
|
|
@ -450,4 +451,7 @@
|
|||
;; end emits a runtime inst/uuid value (host/chez/inst-time.ss).
|
||||
(form-inst? form) {:op :inst :source (form-inst-source form)}
|
||||
(form-uuid? form) {:op :uuid :source (form-uuid-source form)}
|
||||
;; a live namespace value spliced into a form (~*ns* in a macro) -> a
|
||||
;; :the-ns leaf the back end reconstructs by name at the call site.
|
||||
(form-ns-value? form) {:op :the-ns :name (form-ns-value-name form)}
|
||||
:else (uncompilable "unsupported form"))))
|
||||
|
|
|
|||
|
|
@ -404,6 +404,8 @@
|
|||
;; #inst / #uuid literals -> runtime inst / uuid values.
|
||||
:inst (str "(jolt-inst-from-string " (chez-str-lit (:source node)) ")")
|
||||
:uuid (str "(jolt-uuid-from-string " (chez-str-lit (:source node)) ")")
|
||||
;; a namespace value spliced into a form (~*ns*) -> reconstruct by name.
|
||||
:the-ns (str "(intern-ns! " (chez-str-lit (:name node)) ")")
|
||||
;; (.method target arg*) -> jolt-host-call for an rt-shimmed method, else
|
||||
;; record-method-dispatch (a reify/record protocol method, jolt-jgoc).
|
||||
:host-call (let [m (:method node)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue