From 6869bd5d0c7beb112e193371616eb1500d2d6c13 Mon Sep 17 00:00:00 2001 From: Brummel Date: Sat, 9 May 2026 18:23:52 +0200 Subject: [PATCH] =?UTF-8?q?iter=2022b.2.7:=20fix=20=E2=80=94=20cycle=20ter?= =?UTF-8?q?mination=20guard,=20hoist=20type=5Frepr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/ailang-core/src/workspace.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/ailang-core/src/workspace.rs b/crates/ailang-core/src/workspace.rs index 650cf1f..eb3caab 100644 --- a/crates/ailang-core/src/workspace.rs +++ b/crates/ailang-core/src/workspace.rs @@ -575,15 +575,22 @@ fn build_registry( // step at the same type-hash. for (key, entry) in entries.iter() { let (class_name, type_hash) = key; + let type_repr = type_head_name(&entry.instance.type_); + // Iter 22b.2 leaves superclass-cycle detection to a future arm; + // here we just terminate the walk. + let mut visited: BTreeSet<&str> = BTreeSet::new(); let mut current = class_by_name.get(class_name.as_str()).copied(); while let Some(c) = current { + if !visited.insert(c.name.as_str()) { + break; + } if let Some(sc) = &c.superclass { let sc_key = (sc.class.clone(), type_hash.clone()); if !entries.contains_key(&sc_key) { return Err(WorkspaceLoadError::MissingSuperclassInstance { class: class_name.clone(), superclass: sc.class.clone(), - type_repr: type_head_name(&entry.instance.type_), + type_repr: type_repr.clone(), }); } current = class_by_name.get(sc.class.as_str()).copied();