Skip to content

Commit 45487dc

Browse files
Merge pull request #191 from sumleo/fix/unregister-package-stale-exports
Fix stale exports/imports/definitions after unregister_package
2 parents 5db4011 + db6554c commit 45487dc

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

crates/wac-graph/src/graph.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,15 @@ impl CompositionGraph {
543543
"invalid package id"
544544
);
545545

546+
// Remove exports and definitions associated with the package before
547+
// removing nodes, as retain_nodes invalidates the node indices.
548+
self.exports
549+
.retain(|_, n| self.graph[*n].package != Some(package));
550+
self.defined
551+
.retain(|_, n| self.graph[*n].package != Some(package));
552+
self.imports
553+
.retain(|_, n| self.graph[*n].package != Some(package));
554+
546555
// Remove all nodes associated with the package
547556
self.graph
548557
.retain_nodes(|g, i| g[i].package != Some(package));
@@ -1959,4 +1968,34 @@ mod test {
19591968
UnexportError::MustExportDefinition
19601969
));
19611970
}
1971+
1972+
#[test]
1973+
fn it_cleans_up_exports_on_unregister_package() {
1974+
let mut graph = CompositionGraph::new();
1975+
let bytes = wat::parse_str(
1976+
r#"(component
1977+
(import "f" (func))
1978+
(export "g" (func 0))
1979+
)"#,
1980+
)
1981+
.unwrap();
1982+
1983+
let package =
1984+
wac_types::Package::from_bytes("test:pkg", None, bytes, graph.types_mut()).unwrap();
1985+
let pkg_id = graph.register_package(package).unwrap();
1986+
1987+
// Create an instantiation and export an alias
1988+
let inst_id = graph.instantiate(pkg_id);
1989+
let alias_id = graph.alias_instance_export(inst_id, "g").unwrap();
1990+
graph.export(alias_id, "g").unwrap();
1991+
1992+
assert!(graph.get_export("g").is_some());
1993+
1994+
// Unregistering the package should clean up exports
1995+
graph.unregister_package(pkg_id);
1996+
assert!(
1997+
graph.get_export("g").is_none(),
1998+
"exports should be cleaned up after unregister_package"
1999+
);
2000+
}
19622001
}

0 commit comments

Comments
 (0)