#252 uiop/pathname block dies silently: parse-unix-namestring / parse-native-namestring cells hold non-funcallable ? objects — blocks defsystem (index 0 out of bounds), image-restore hooks, output-translation defparams
closedLayer 8 of the operate-chain campaign (successor to #244, which fixed the component-name reader clobber).
Symptoms on build/funcl (census 14 after 7ed84cf):
- (uiop/pathname::parse-native-namestring "/tmp/") and (uiop/pathname::parse-unix-namestring "/tmp/") both raise "attempt to call an object that is not a function" — their fn CELLS hold ? objects (fn-ptr prints as ?, e.g. 1081787378), while the defun sources are healthy and portable.
- The fn-table HAS a PARSE-NATIVE-NAMESTRING entry (offset 1754088 in the probe run) but ag-runtime-fn-addr-lookup returns -1 for the name — table entry vs runtime lookup disagree (key normalization? mixed string/symbol keys? entry outside the runtime-visible range?).
- No error is reported anywhere near uiop/pathname during the load — the region dies SILENTLY (#186 family).
Downstream casualties, all with "not a function": setup-temporary-directory + compute-user-cache image-restore hooks (2 errors), the 4 output-translations-/source-registry- defparams, 1 "| in: IF", and the new defsystem blocker "index 0 out of bounds | in: DEFSYSTEM" (defsystem needs the pathname parsers; find-system => NIL).
Where to start: the ? cells + fn-table/lookup disagreement smell like the #147 lambda-as-value object or a silently-mangled expansion assigning cells in that with-upgradability block (asdf.lisp ~3100-3300). Old pre-#245 note: this block showed MACROEVAL-PASSTHRU REDUCE. Probe recipes in /tmp/244-probe4.lisp (fn-ptr + fn-table walk + sibling calls).
FIXED across caed21d (reader/ast-ir) + 0a1e551 (defsetf regression caught by the suite gate). Root cause of the silent uiop/pathname region death: split-string uses flet locals called via #'p, and the reader emitted the FUNCTION head of #'FORM as a RAW byte-vector. bv-eq lowers to plain
eqat runtime (it assumes reader bvs never reach it), so every compiled(eq head (quote function))check in flet/labels %call-to-funcall MISSED #'LOCAL — split-string returned garbage and (funcall #'local) dumped core. Every uiop/pathname defun that used #'-passed local predicates (split-string, split-name-type, directorize-pathname-host-device, ...) died, cascading into parse-native-namestring, the image-restore hooks, the output-translation defparams, and defsystem.Fix: reader-read-sharp-quote now interns the FUNCTION head at runtime (EQ to the compiled quote head), gated on the cave#44 unification flag so the cold stage1 path is untouched.
Diagnosis path (for the ledger): truncated asdf at the uiop/pathname block, probed every defun cell → only directorize-* was dead at first; narrowed by calling each with real args → split-name-type; → strcat → reduce/strcat → replace... no; finally split-string standalone → bisected to two-flet-binding + #' + defun-compile (lambda-lift) path. Minimal repro: (defun f (s e) (flet ((p (c) (eql c #.)) (d () 1)) (position-if #'p s :end e :from-end t))) returned garbage / SEGV.
Census: 14 -> 8. All 8 shards green. Two self-inflicted regressions the suite caught and I fixed in the same pass: defsetf (intern/concatenate not tree-walker ops -> stage1 asdf-compile stack overflow, now %setf-symbol) and the #250 ast-ir defmacro case (ag-head-eq-defmacro absent from the ast-ir minimal self-host build -> SEGV, now a local ir-head-eq-defmacro). Closing.