diff options
Diffstat (limited to 'src/cmd/compile/internal/ir/scc.go')
-rw-r--r-- | src/cmd/compile/internal/ir/scc.go | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/src/cmd/compile/internal/ir/scc.go b/src/cmd/compile/internal/ir/scc.go index 4f646e22b5..f35c4d44e9 100644 --- a/src/cmd/compile/internal/ir/scc.go +++ b/src/cmd/compile/internal/ir/scc.go @@ -76,48 +76,27 @@ func (v *bottomUpVisitor) visit(n *Func) uint32 { min := v.visitgen v.stack = append(v.stack, n) + do := func(defn Node) { + if defn != nil { + if m := v.visit(defn.(*Func)); m < min { + min = m + } + } + } + Visit(n, func(n Node) { switch n.Op() { case ONAME: - n := n.(*Name) - if n.Class_ == PFUNC { - if n != nil && n.Name().Defn != nil { - if m := v.visit(n.Name().Defn.(*Func)); m < min { - min = m - } - } + if n := n.(*Name); n.Class_ == PFUNC { + do(n.Defn) } - case OMETHEXPR: - n := n.(*MethodExpr) - fn := MethodExprName(n) - if fn != nil && fn.Defn != nil { - if m := v.visit(fn.Defn.(*Func)); m < min { - min = m - } - } - case ODOTMETH: - n := n.(*SelectorExpr) - fn := MethodExprName(n) - if fn != nil && fn.Op() == ONAME && fn.Class_ == PFUNC && fn.Defn != nil { - if m := v.visit(fn.Defn.(*Func)); m < min { - min = m - } - } - case OCALLPART: - n := n.(*CallPartExpr) - fn := AsNode(n.Method.Nname) - if fn != nil && fn.Op() == ONAME { - if fn := fn.(*Name); fn.Class_ == PFUNC && fn.Name().Defn != nil { - if m := v.visit(fn.Name().Defn.(*Func)); m < min { - min = m - } - } + case ODOTMETH, OCALLPART, OMETHEXPR: + if fn := MethodExprName(n); fn != nil { + do(fn.Defn) } case OCLOSURE: n := n.(*ClosureExpr) - if m := v.visit(n.Func); m < min { - min = m - } + do(n.Func) } }) |