From 15deb66dff03099ce344cb635b1b879594838361 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 4 Jul 2022 11:22:37 +0200 Subject: [PATCH] Fix tree builder bugs related to dfs --- data/acltreebuilder.go | 6 ++++-- data/treebuilder.go | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/data/acltreebuilder.go b/data/acltreebuilder.go index f97aa805..9b669671 100644 --- a/data/acltreebuilder.go +++ b/data/acltreebuilder.go @@ -109,10 +109,12 @@ func (tb *ACLTreeBuilder) buildTreeFromStart(heads []string) (err error) { return } -func (tb *ACLTreeBuilder) dfsFromStart(stack []string) (buf []*Change, possibleRoots []*Change, err error) { +func (tb *ACLTreeBuilder) dfsFromStart(heads []string) (buf []*Change, possibleRoots []*Change, err error) { + stack := make([]string, len(heads), len(heads)*2) + copy(stack, heads) + buf = make([]*Change, 0, len(stack)*2) uniqMap := make(map[string]struct{}) - for len(stack) > 0 { id := stack[len(stack)-1] stack = stack[:len(stack)-1] diff --git a/data/treebuilder.go b/data/treebuilder.go index 1d04804b..62cae49c 100644 --- a/data/treebuilder.go +++ b/data/treebuilder.go @@ -125,10 +125,12 @@ func (tb *TreeBuilder) buildTreeFromStart(heads []string) (err error) { return } -func (tb *TreeBuilder) dfsFromStart(stack []string) (buf []*Change, possibleRoots []*Change, err error) { +func (tb *TreeBuilder) dfsFromStart(heads []string) (buf []*Change, possibleRoots []*Change, err error) { + stack := make([]string, len(heads), len(heads)*2) + copy(stack, heads) + buf = make([]*Change, 0, len(stack)*2) uniqMap := make(map[string]struct{}) - for len(stack) > 0 { id := stack[len(stack)-1] stack = stack[:len(stack)-1] @@ -166,7 +168,10 @@ func (tb *TreeBuilder) buildTree(heads []string, breakpoint string) (err error) return } -func (tb *TreeBuilder) dfs(stack []string, breakpoint string) (buf []*Change, err error) { +func (tb *TreeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) { + stack := make([]string, len(heads), len(heads)*2) + copy(stack, heads) + buf = make([]*Change, 0, len(stack)*2) uniqMap := map[string]struct{}{breakpoint: {}} for len(stack) > 0 {