From 5a5f7e5be9498af219a36401b1d2a13b553402e8 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Tue, 18 Jul 2023 11:55:03 +0800 Subject: Fix a bug of unnecessarily cloning nodes. * chain/src/item/default/splone.rs: Previously when we split nodes, we always clone the parent if the labels differ. This turns out to be incorrect if the new label is open whereas the old label is closed. In that case, the old parent should not contain the new node as a child, as a closed node should not contain an open node. I am not yet entirely sure this fix is correct, so more test await us. --- chain/src/item/default/extract.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'chain/src/item/default/extract.rs') diff --git a/chain/src/item/default/extract.rs b/chain/src/item/default/extract.rs index 96f5119..b99c541 100644 --- a/chain/src/item/default/extract.rs +++ b/chain/src/item/default/extract.rs @@ -188,11 +188,25 @@ impl DefaultForest> { 1 => { let child = *roots_stack.first().unwrap(); - builder.add_vertex(self.vertex_label(child)?.ok_or(Error::NodeNoLabel(child))?); + // Make this a plain node. + // + // This situation will be handled properly in + // later codes. + + let plain_child_label = ForestLabel::new( + self.vertex_label(child)? + .ok_or(Error::NodeNoLabel(child))? + .label(), + ForestLabelType::Plain, + ); + + builder.add_vertex(plain_child_label); } _ => { let builder_root = builder.add_vertex(original_root_label); + // The clone indices have to be preserved so that + // we can track those nodes later. for child in roots_stack.iter().copied() { let child_node = builder.add_vertex( self.vertex_label(child)?.ok_or(Error::NodeNoLabel(child))?, -- cgit v1.2.3-18-g5258