Fix seven more JVM divergences (rewrite-clj full suite)
Running the whole rewrite-clj test suite (159 tests) surfaced seven more bugs; with these it passes 3377/0/0. Each is a general jolt/JVM divergence: - *out* was pinned to the startup stdout port, so (.write *out* …) escaped a with-out-str capture (z/print writes via *out*). It now resolves the live current-output-port, like print/__write, so a redirect is seen. - nth / assoc past the end of a vector or seq threw a bare Chez error (class :object). Throw IndexOutOfBoundsException, matching the JVM. - A number's .toString(radix) ignored the base. Render in the base, lowercase (rewrite-clj rebuilds 0xff / 0377 / 2r1001 through it). - A required namespace's own :as aliases leaked into its requirer: the loaded ns form compiles while (chez-current-ns) is still the requirer, so ce-scan-requires! registered the loaded ns's aliases under the wrong ns and clobbered a same-named alias there. Register an (ns NAME …) form's aliases under NAME. - A quoted collection dropped its metadata; now it keeps USER metadata (drops the reader's :line/:column/:file), like a Clojure quoted constant. - enumeration-seq only did (seq e); it now drives a java.util.Enumeration through hasMoreElements/nextElement, and StringTokenizer implements them. Regressions: corpus rows (with-out-str/*out*, nth/assoc bounds, toString radix, quote metadata, enumeration-seq) certified against JVM; a smoke fixture for the alias leak (a required ns's alias must not leak). tools.reader + rewrite-clj added to docs/libraries.md. make test green.
This commit is contained in:
parent
53112d06fb
commit
9bcac13fd2
15 changed files with 999 additions and 906 deletions
|
|
@ -300,7 +300,14 @@
|
|||
|
||||
;; --- JVM-shape stubs and trivial shells --------------------------------------
|
||||
;; Pure compositions or documented jolt stubs; the host keeps nothing.
|
||||
(defn enumeration-seq [e] (seq e))
|
||||
;; enumeration-seq drives a java.util.Enumeration (StringTokenizer, etc.) through
|
||||
;; hasMoreElements/nextElement, like the JVM; an already-seqable arg (a jolt seq —
|
||||
;; some host code passes a list) just seqs.
|
||||
(defn enumeration-seq [e]
|
||||
(if (or (nil? e) (seq? e) (sequential? e))
|
||||
(seq e)
|
||||
(lazy-seq (when (.hasMoreElements e)
|
||||
(cons (.nextElement e) (enumeration-seq e))))))
|
||||
(defn iterator-seq [i] (seq i))
|
||||
|
||||
;; jolt is single-threaded: a promise is an atom, deref never blocks
|
||||
|
|
|
|||
|
|
@ -394,7 +394,18 @@
|
|||
|
||||
(defn- analyze-special [ctx op items env]
|
||||
(case op
|
||||
"quote" (quote-node (second items))
|
||||
;; A quoted collection keeps its USER metadata (rewrite-clj coerces
|
||||
;; '^:x (4 5 6) and expects the meta back), but not the reader's location keys
|
||||
;; (:line/:column/:file) — like Clojure, which strips those from a quoted
|
||||
;; constant. The kept metadata is itself part of the literal, so quote it.
|
||||
"quote" (let [qf (second items)
|
||||
m (form-coll-meta qf)
|
||||
m (when (map? m)
|
||||
(let [u (dissoc m :line :column :end-line :end-column :file)]
|
||||
(when (seq u) u)))]
|
||||
(if (nil? m)
|
||||
(quote-node qf)
|
||||
(invoke (var-ref "clojure.core" "with-meta") [(quote-node qf) (quote-node m)])))
|
||||
"if" (do
|
||||
;; 2 or 3 argument forms only (spec 03-special-forms X1)
|
||||
(when (or (< (count items) 3) (> (count items) 4))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue