From c28ca67a961a0c1d149a249918a15ed74c61af27 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 4 Jan 2021 22:58:24 -0800 Subject: [PATCH] [dev.regabi] cmd/compile: fix ir.Dump for []*CaseClause, etc Dump uses reflection to print IR nodes, and it only knew how to print out the Nodes slice type itself. This CL adds support for printing any slice whose element type implements Node, such as SwitchStmt and SelectStmt's clause lists. Change-Id: I2fd8defe11868b564d1d389ea3cd9b8abcefac62 Reviewed-on: https://go-review.googlesource.com/c/go/+/281537 Trust: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Go Bot Reviewed-by: Cuong Manh Le --- src/cmd/compile/internal/ir/fmt.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/cmd/compile/internal/ir/fmt.go b/src/cmd/compile/internal/ir/fmt.go index 92ea160a28..a4e769f508 100644 --- a/src/cmd/compile/internal/ir/fmt.go +++ b/src/cmd/compile/internal/ir/fmt.go @@ -1237,10 +1237,25 @@ func dumpNode(w io.Writer, n Node, depth int) { fmt.Fprintf(w, "%+v-%s", n.Op(), name) } dumpNodes(w, val, depth+1) + default: + if vf.Kind() == reflect.Slice && vf.Type().Elem().Implements(nodeType) { + if vf.Len() == 0 { + continue + } + if name != "" { + indent(w, depth) + fmt.Fprintf(w, "%+v-%s", n.Op(), name) + } + for i, n := 0, vf.Len(); i < n; i++ { + dumpNode(w, vf.Index(i).Interface().(Node), depth+1) + } + } } } } +var nodeType = reflect.TypeOf((*Node)(nil)).Elem() + func dumpNodes(w io.Writer, list Nodes, depth int) { if len(list) == 0 { fmt.Fprintf(w, " ")