| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package noder | |
| import ( | |
| "cmd/compile/internal/ir" | |
| "cmd/compile/internal/syntax" | |
| ) | |
| // TODO(mdempsky): Investigate replacing with switch statements or dense arrays. | |
| var branchOps = [...]ir.Op{ | |
| syntax.Break: ir.OBREAK, | |
| syntax.Continue: ir.OCONTINUE, | |
| syntax.Fallthrough: ir.OFALL, | |
| syntax.Goto: ir.OGOTO, | |
| } | |
| var callOps = [...]ir.Op{ | |
| syntax.Defer: ir.ODEFER, | |
| syntax.Go: ir.OGO, | |
| } | |
| // initDefn marks the given names as declared by defn and populates | |
| // its Init field with ODCL nodes. It then reports whether any names | |
| // were so declared, which can be used to initialize defn.Def. | |
| func initDefn(defn ir.InitNode, names []*ir.Name) bool { | |
| if len(names) == 0 { | |
| return false | |
| } | |
| init := make([]ir.Node, len(names)) | |
| for i, name := range names { | |
| name.Defn = defn | |
| init[i] = ir.NewDecl(name.Pos(), ir.ODCL, name) | |
| } | |
| defn.SetInit(init) | |
| return true | |
| } | |
| // unpackTwo returns the first two nodes in list. If list has fewer | |
| // than 2 nodes, then the missing nodes are replaced with nils. | |
| func unpackTwo(list []ir.Node) (fst, snd ir.Node) { | |
| switch len(list) { | |
| case 0: | |
| return nil, nil | |
| case 1: | |
| return list[0], nil | |
| default: | |
| return list[0], list[1] | |
| } | |
| } |