Refactor phase 0: dead code + isolated bugs
Pure cleanup ahead of the structural phases (docs/architecture-refactor-plan.md). No behavior change except the two bug fixes, which are covered by a regression row. Dead code (all verified zero-reference or overridden): - core-resolve / core-satisfies? / core-type->str seed stubs + bindings — resolve and satisfies? are interned by install-stateful-fns! (the seed copies were shadowed); type->str was an inert SCI stub with no callers. - find defined twice in 20-coll.clj; the dead copy returned a plain vector (wrong — the live def at :787 returns a real map-entry) with a comment that contradicted it. - mark-hint (passes.clj), phs-to-struct (phm), shape-vals / ns-imports-fn (types) — unreferenced. - redundant local pad2 in javatime (module-level one already in scope). Bugs: - File.toURL stored :url but every :jolt/url method reads :spec, so a URL from (.toURL file) returned nil from all its methods. Now stores :spec (+ spec row). - pl-rest had a no-op (if (plist? r) r r); collapsed to r. - :map-shapes? was missing from the deps-image cache key — two runs differing only in map-shapes could reuse each other's image. Also dropped read-quote's unused pos param. Full gate green.
This commit is contained in:
parent
859c8cc02a
commit
d837b304f4
10 changed files with 19 additions and 38 deletions
|
|
@ -343,10 +343,6 @@
|
||||||
;; qualified-/simple- keyword?/symbol? moved above qualified-ident? (forward
|
;; qualified-/simple- keyword?/symbol? moved above qualified-ident? (forward
|
||||||
;; references are analysis errors now — jolt-2o7.3).
|
;; references are analysis errors now — jolt-2o7.3).
|
||||||
|
|
||||||
;; find: the map entry [k v] when k is present (nil values included), nil
|
|
||||||
;; otherwise. contains? gives vectors-by-index for free, matching Clojure.
|
|
||||||
(defn find [m k]
|
|
||||||
(when (contains? m k) [k (get m k)]))
|
|
||||||
|
|
||||||
;; realized?: defined on the pending types only (delay/lazy-seq/future read
|
;; realized?: defined on the pending types only (delay/lazy-seq/future read
|
||||||
;; Tagged-value predicates. The constructors (atom/volatile!/...) stay in Janet,
|
;; Tagged-value predicates. The constructors (atom/volatile!/...) stay in Janet,
|
||||||
|
|
|
||||||
|
|
@ -833,7 +833,6 @@
|
||||||
;; tag a node (any expression, not just a :local) so the back end can specialize
|
;; tag a node (any expression, not just a :local) so the back end can specialize
|
||||||
;; a lookup whose SUBJECT is that node — this is what makes nested access work:
|
;; a lookup whose SUBJECT is that node — this is what makes nested access work:
|
||||||
;; (:direction ray) is tagged struct, so (:r (:direction ray)) drops its guard.
|
;; (:direction ray) is tagged struct, so (:r (:direction ray)) drops its guard.
|
||||||
(defn- mark-hint [node h] (assoc node :hint h))
|
|
||||||
;; tag a lookup subject as a struct, carrying the complete shape when known
|
;; tag a lookup subject as a struct, carrying the complete shape when known
|
||||||
;; (so the back end bare-indexes) — jolt-t34
|
;; (so the back end bare-indexes) — jolt-t34
|
||||||
(defn- mark-struct [node t]
|
(defn- mark-struct [node t]
|
||||||
|
|
|
||||||
|
|
@ -2361,8 +2361,6 @@
|
||||||
# with `count`, discard the result.
|
# with `count`, discard the result.
|
||||||
# assert — (assert x) / (assert x message). Throws when x is falsy.
|
# assert — (assert x) / (assert x message). Throws when x is falsy.
|
||||||
|
|
||||||
# resolve stub — returns nil (symbols not found in Jolt's clojure.core)
|
|
||||||
(defn core-resolve [sym] nil) # shadowed by the resolve special form (needs ctx)
|
|
||||||
# ns-name now lives in the Clojure collection tier (pure over get + symbol).
|
# ns-name now lives in the Clojure collection tier (pure over get + symbol).
|
||||||
|
|
||||||
# update lives in the Clojure kernel tier — core/00-kernel.clj. update-in stays
|
# update lives in the Clojure kernel tier — core/00-kernel.clj. update-in stays
|
||||||
|
|
@ -2409,11 +2407,8 @@
|
||||||
:name {:jolt/type :symbol :ns nil :name name-str}
|
:name {:jolt/type :symbol :ns nil :name name-str}
|
||||||
:methods methods})
|
:methods methods})
|
||||||
|
|
||||||
(def core-satisfies? (fn [proto-sym obj] false))
|
|
||||||
|
|
||||||
# extends? is a real overlay fn now (30-macros, over extenders).
|
# extends? is a real overlay fn now (30-macros, over extenders).
|
||||||
(def core-implements? (fn [& args] false))
|
(def core-implements? (fn [& args] false))
|
||||||
(def core-type->str (fn [& args] ""))
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Additional clojure.core functions (conformance batch)
|
# Additional clojure.core functions (conformance batch)
|
||||||
|
|
@ -2936,14 +2931,13 @@
|
||||||
"not" core-not
|
"not" core-not
|
||||||
"Object" core-Object
|
"Object" core-Object
|
||||||
"make-protocol" core-make-protocol
|
"make-protocol" core-make-protocol
|
||||||
"satisfies?" core-satisfies?
|
# satisfies?/resolve are interned by install-stateful-fns! (ctx-capturing);
|
||||||
|
# type->str was an inert SCI stub with no callers.
|
||||||
"implements?" core-implements?
|
"implements?" core-implements?
|
||||||
"type->str" core-type->str
|
|
||||||
"volatile!" core-volatile!
|
"volatile!" core-volatile!
|
||||||
"Thread" core-Thread
|
"Thread" core-Thread
|
||||||
"ThreadLocal" core-ThreadLocal
|
"ThreadLocal" core-ThreadLocal
|
||||||
"IllegalStateException" core-IllegalStateException
|
"IllegalStateException" core-IllegalStateException
|
||||||
"resolve" core-resolve
|
|
||||||
"copy-core-var" core-copy-core-var
|
"copy-core-var" core-copy-core-var
|
||||||
"copy-var" core-copy-var
|
"copy-var" core-copy-var
|
||||||
"macrofy" core-macrofy
|
"macrofy" core-macrofy
|
||||||
|
|
|
||||||
|
|
@ -513,7 +513,7 @@
|
||||||
(register-class-statics! "java.util.TimeZone"
|
(register-class-statics! "java.util.TimeZone"
|
||||||
@{"getTimeZone" (fn [id] (make-tz id))})
|
@{"getTimeZone" (fn [id] (make-tz id))})
|
||||||
# java.text.SimpleDateFormat: minimal formatter supporting y M d H m s tokens.
|
# java.text.SimpleDateFormat: minimal formatter supporting y M d H m s tokens.
|
||||||
(defn- pad2 [n] (if (< n 10) (string "0" n) (string n)))
|
# (pad2 is the module-level helper above.)
|
||||||
(defn- sdf-format [pattern ms utc?]
|
(defn- sdf-format [pattern ms utc?]
|
||||||
(def d (os/date (math/floor (/ ms 1000)) (not utc?)))
|
(def d (os/date (math/floor (/ ms 1000)) (not utc?)))
|
||||||
(def out @"")
|
(def out @"")
|
||||||
|
|
@ -627,7 +627,7 @@
|
||||||
(when (= :directory (os/stat p :mode)) (os/dir p))))
|
(when (= :directory (os/stat p :mode)) (os/dir p))))
|
||||||
"toPath" (fn [self] @{:jolt/type :jolt/nio-path :s (get self :path)})
|
"toPath" (fn [self] @{:jolt/type :jolt/nio-path :s (get self :path)})
|
||||||
"toURI" (fn [self] (string "file:" (jfile-abs (get self :path))))
|
"toURI" (fn [self] (string "file:" (jfile-abs (get self :path))))
|
||||||
"toURL" (fn [self] @{:jolt/type :jolt/url :url (string "file:" (jfile-abs (get self :path)))})
|
"toURL" (fn [self] @{:jolt/type :jolt/url :spec (string "file:" (jfile-abs (get self :path)))})
|
||||||
"delete" (fn [self] (let [r (protect (os/rm (get self :path)))] (truthy? (r 0))))
|
"delete" (fn [self] (let [r (protect (os/rm (get self :path)))] (truthy? (r 0))))
|
||||||
"mkdir" (fn [self] (truthy? ((protect (os/mkdir (get self :path))) 0)))
|
"mkdir" (fn [self] (truthy? ((protect (os/mkdir (get self :path))) 0)))
|
||||||
"mkdirs" (fn [self] (truthy? ((protect (os/mkdir (get self :path))) 0)))
|
"mkdirs" (fn [self] (truthy? ((protect (os/mkdir (get self :path))) 0)))
|
||||||
|
|
|
||||||
|
|
@ -440,10 +440,11 @@
|
||||||
(defn- deps-image-path [ns-name]
|
(defn- deps-image-path [ns-name]
|
||||||
(def dir (or (os/getenv "JOLT_IMAGE_CACHE_DIR") (os/getenv "TMPDIR") "/tmp"))
|
(def dir (or (os/getenv "JOLT_IMAGE_CACHE_DIR") (os/getenv "TMPDIR") "/tmp"))
|
||||||
(def env (ctx :env))
|
(def env (ctx :env))
|
||||||
(def key (string/format "%q|%q|%q|%q|%q|%q|%q|%q"
|
(def key (string/format "%q|%q|%q|%q|%q|%q|%q|%q|%q"
|
||||||
jolt-version ns-name (os/getenv "JOLT_PATH")
|
jolt-version ns-name (os/getenv "JOLT_PATH")
|
||||||
(get env :direct-linking?) (get env :inline?)
|
(get env :direct-linking?) (get env :inline?)
|
||||||
(get env :shapes?) (get env :whole-program?)
|
(get env :shapes?) (get env :map-shapes?)
|
||||||
|
(get env :whole-program?)
|
||||||
(os/getenv "JOLT_FEATURES")))
|
(os/getenv "JOLT_FEATURES")))
|
||||||
(string dir "/jolt-deps-" (band (hash key) 0x7FFFFFFF) ".jimg"))
|
(string dir "/jolt-deps-" (band (hash key) 0x7FFFFFFF) ".jimg"))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -298,6 +298,3 @@
|
||||||
(defn phs-get [s x &opt default]
|
(defn phs-get [s x &opt default]
|
||||||
(default default nil)
|
(default default nil)
|
||||||
(if (phm-contains? (s :phm) x) x default))
|
(if (phm-contains? (s :phm) x) x default))
|
||||||
|
|
||||||
(defn phs-to-struct [s]
|
|
||||||
(phm-to-struct (s :phm)))
|
|
||||||
|
|
|
||||||
|
|
@ -59,8 +59,7 @@
|
||||||
[p]
|
[p]
|
||||||
(if (or (= 0 (get p :count)) (nil? (get p :rest)))
|
(if (or (= 0 (get p :count)) (nil? (get p :rest)))
|
||||||
@[]
|
@[]
|
||||||
(let [r (get p :rest)]
|
(get p :rest)))
|
||||||
(if (plist? r) r r))))
|
|
||||||
|
|
||||||
(defn pl-from-indexed
|
(defn pl-from-indexed
|
||||||
"Build a plist from a Janet array/tuple, preserving order. O(n)."
|
"Build a plist from a Janet array/tuple, preserving order. O(n)."
|
||||||
|
|
|
||||||
|
|
@ -605,7 +605,7 @@
|
||||||
(string? form) (buffer? form) (keyword? form)
|
(string? form) (buffer? form) (keyword? form)
|
||||||
(and (struct? form) (= :jolt/char (form :jolt/type)))))
|
(and (struct? form) (= :jolt/char (form :jolt/type)))))
|
||||||
|
|
||||||
(defn read-quote [s pos new-pos token-sym]
|
(defn read-quote [s new-pos token-sym]
|
||||||
(let [[form final-pos] (read-form s new-pos)]
|
(let [[form final-pos] (read-form s new-pos)]
|
||||||
# Spec 02-reader S25: syntax-quote of a self-evaluating literal is the
|
# Spec 02-reader S25: syntax-quote of a self-evaluating literal is the
|
||||||
# literal, collapsed at READ time (matching Clojure's reader) — so nested
|
# literal, collapsed at READ time (matching Clojure's reader) — so nested
|
||||||
|
|
@ -702,21 +702,21 @@
|
||||||
|
|
||||||
# quote
|
# quote
|
||||||
(= c 39)
|
(= c 39)
|
||||||
(read-quote s pos (+ pos 1) (sym "quote"))
|
(read-quote s (+ pos 1) (sym "quote"))
|
||||||
|
|
||||||
# syntax-quote / backtick
|
# syntax-quote / backtick
|
||||||
(= c 96)
|
(= c 96)
|
||||||
(read-quote s pos (+ pos 1) (sym "syntax-quote"))
|
(read-quote s (+ pos 1) (sym "syntax-quote"))
|
||||||
|
|
||||||
# unquote ~
|
# unquote ~
|
||||||
(= c 126)
|
(= c 126)
|
||||||
(if (and (< (+ pos 1) (length s)) (= (s (+ pos 1)) 64))
|
(if (and (< (+ pos 1) (length s)) (= (s (+ pos 1)) 64))
|
||||||
(read-quote s pos (+ pos 2) (sym "unquote-splicing"))
|
(read-quote s (+ pos 2) (sym "unquote-splicing"))
|
||||||
(read-quote s pos (+ pos 1) (sym "unquote")))
|
(read-quote s (+ pos 1) (sym "unquote")))
|
||||||
|
|
||||||
# deref
|
# deref
|
||||||
(= c 64)
|
(= c 64)
|
||||||
(read-quote s pos (+ pos 1) (sym "deref"))
|
(read-quote s (+ pos 1) (sym "deref"))
|
||||||
|
|
||||||
# metadata
|
# metadata
|
||||||
(= c 94)
|
(= c 94)
|
||||||
|
|
|
||||||
|
|
@ -524,12 +524,6 @@
|
||||||
(let [ns (ctx-find-ns ctx (ctx-current-ns ctx))]
|
(let [ns (ctx-find-ns ctx (ctx-current-ns ctx))]
|
||||||
(ns :aliases)))
|
(ns :aliases)))
|
||||||
|
|
||||||
(defn ns-imports-fn
|
|
||||||
"Return the import map of the current namespace."
|
|
||||||
[ctx]
|
|
||||||
(let [ns (ctx-find-ns ctx (ctx-current-ns ctx))]
|
|
||||||
(ns :imports)))
|
|
||||||
|
|
||||||
(defn find-var
|
(defn find-var
|
||||||
"Resolve a symbol to a var in the current context.
|
"Resolve a symbol to a var in the current context.
|
||||||
Looks in current namespace first, then clojure.core."
|
Looks in current namespace first, then clojure.core."
|
||||||
|
|
@ -652,7 +646,6 @@
|
||||||
(let [t @{}] (each kk (desc :jolt/shape) (put t kk (shape-get rec kk nil))) (put t k v) (table/to-struct t))))
|
(let [t @{}] (each kk (desc :jolt/shape) (put t kk (shape-get rec kk nil))) (put t k v) (table/to-struct t))))
|
||||||
(defn shape-count [rec] (- (length rec) 1))
|
(defn shape-count [rec] (- (length rec) 1))
|
||||||
(defn shape-contains? [rec k] (not (nil? (get ((in rec 0) :idx) k))))
|
(defn shape-contains? [rec k] (not (nil? (get ((in rec 0) :idx) k))))
|
||||||
(defn shape-vals [rec] (tuple/slice rec 1))
|
|
||||||
# a struct snapshot of a shape-rec — the reusable bridge for ops that already
|
# a struct snapshot of a shape-rec — the reusable bridge for ops that already
|
||||||
# handle structs (dissoc, vals, seq, equality, print, ...) without per-op code
|
# handle structs (dissoc, vals, seq, equality, print, ...) without per-op code
|
||||||
(defn shape->struct [rec]
|
(defn shape->struct [rec]
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,8 @@
|
||||||
"(do (require (quote clojure.java.io)) (janet/spit \"/tmp/jolt-lineseq-spec.txt\" \"a\\nb\\n\") (vec (line-seq (clojure.java.io/reader \"/tmp/jolt-lineseq-spec.txt\"))))"]
|
"(do (require (quote clojure.java.io)) (janet/spit \"/tmp/jolt-lineseq-spec.txt\" \"a\\nb\\n\") (vec (line-seq (clojure.java.io/reader \"/tmp/jolt-lineseq-spec.txt\"))))"]
|
||||||
["with-open closes shim" "97"
|
["with-open closes shim" "97"
|
||||||
"(with-open [r (StringReader. \"a\")] (.read r))"]
|
"(with-open [r (StringReader. \"a\")] (.read r))"]
|
||||||
|
["File.toURL methods read it back" "\"file:/tmp/x\""
|
||||||
|
"(do (require (quote clojure.java.io)) (.toString (.toURL (clojure.java.io/file \"/tmp/x\"))))"]
|
||||||
["vector :import shares deftype ctor" "\"hi!\""
|
["vector :import shares deftype ctor" "\"hi!\""
|
||||||
"(do (ns spec.nodea) (defprotocol SpecP (spec-pm [this])) (deftype SpecTN [t] SpecP (spec-pm [this] (str t \"!\"))) (ns spec.nodeb (:import [spec.nodea SpecTN])) (.spec-pm (SpecTN. \"hi\")))"])
|
"(do (ns spec.nodea) (defprotocol SpecP (spec-pm [this])) (deftype SpecTN [t] SpecP (spec-pm [this] (str t \"!\"))) (ns spec.nodeb (:import [spec.nodea SpecTN])) (.spec-pm (SpecTN. \"hi\")))"])
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue