Refuse own-family reads before any survey, and panic on a clash where readSurvey.edge enters a read's pins

This commit is contained in:
2026-09-29 13:09:19 +02:00
committed by Lillem4n
parent 25857fb660
commit 6cb2d143d6
3 changed files with 18 additions and 2 deletions
+3
View File
@@ -257,6 +257,9 @@ func checkNodeFences(s nodeScope) error {
return err
}
if refs {
if err := s(checkOwnFamilies); err != nil {
return err
}
if err := s(fence.checkDraws); err != nil {
return err
}
+9 -1
View File
@@ -24,7 +24,7 @@ func (f *drawFence) checkDrawGroup(path string, n node) error {
return nil
}
func (f *drawFence) checkDraws(path string, n node) error {
func checkOwnFamilies(path string, n node) error {
t, ok := n.(*template)
if !ok {
return nil
@@ -32,6 +32,14 @@ func (f *drawFence) checkDraws(path string, n node) error {
if err := checkOwnFamily(t); err != nil {
return fmt.Errorf("%s: %w", path, err)
}
return nil
}
func (f *drawFence) checkDraws(path string, n node) error {
t, ok := n.(*template)
if !ok {
return nil
}
if !f.readsPath(t) {
return nil
}
+6 -1
View File
@@ -122,7 +122,12 @@ func (s *readSurvey) edge(from node, e renderEdge, at surveyAt) {
s.reads = append(s.reads, pathRead{at, a, tr})
}
if tr != nil {
tr.pins.each(func(t *table, r int) { at.pins = at.pins.entered(t, r) })
tr.pins.each(func(t *table, r int) {
if c := at.pins.clash(t, r); c != nil {
panic(internalError("%s reads %s past a pinned row of %s, which checkOwnFamily refuses", e.reached(), t.selectorSpelling(r), c.path))
}
at.pins = at.pins.entered(t, r)
})
}
}
s.walk(e.to, at)