#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

closed
Opened by atgreen

Layer 8 of the operate-chain campaign (successor to #244, which fixed the component-name reader clobber).

Symptoms on build/funcl (census 14 after 7ed84cf):

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).

Comments (1)

atgreen3992464078

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 eq at 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.