| // 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] |
| } |
| } |