Skip to content

Commit 6f13c1b

Browse files
committed
Avoid cycles in subclass closure
1 parent d84c817 commit 6f13c1b

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

helpers/rust/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ fn main() {
166166
)
167167
.init();
168168

169+
log::info!("Log level set to {}", log::max_level());
170+
169171
if cli.no_derived && cli.only == Some(Action::Derived) {
170172
log::error!("--no-derived and --only=derived are mutually exclusive");
171173
std::process::exit(1);

helpers/rust/src/types/statistics.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ impl DumpStatistics {
7575
}
7676

7777
fn close_subclasses(&mut self) -> usize {
78+
log::info!("Computing subclass closure");
79+
7880
let mut added = 0;
7981
let direct_superclasses = self
8082
.classes
@@ -85,6 +87,7 @@ impl DumpStatistics {
8587

8688
while let Some(class) = class_queue.pop_front() {
8789
let record = self.classes.entry(class).or_default();
90+
let mut done = HashSet::new();
8891
let mut superclasses = record
8992
.direct_superclasses
9093
.iter()
@@ -93,10 +96,16 @@ impl DumpStatistics {
9396

9497
while let Some(superclass) = superclasses.pop_front() {
9598
record.superclasses.insert(superclass);
99+
done.insert(superclass);
96100
added += 1;
97101

98102
if let Some(new_superclasses) = direct_superclasses.get(&superclass) {
99-
superclasses.extend(new_superclasses.iter().cloned());
103+
superclasses.extend(
104+
new_superclasses
105+
.iter()
106+
.filter(|superclass| !done.contains(superclass))
107+
.cloned(),
108+
);
100109
}
101110
}
102111
}
@@ -116,6 +125,8 @@ impl DumpStatistics {
116125
})
117126
.collect::<Vec<_>>();
118127

128+
log::info!("Found {} non-empty classes", classes.len());
129+
119130
for (class, superclasses) in classes {
120131
for super_class in superclasses {
121132
let record = self.classes.entry(super_class).or_default();

0 commit comments

Comments
 (0)