aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/gc/swt.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/gc/swt.go')
-rw-r--r--src/cmd/internal/gc/swt.go212
1 files changed, 80 insertions, 132 deletions
diff --git a/src/cmd/internal/gc/swt.go b/src/cmd/internal/gc/swt.go
index 7c25041b46..81eb56c3a6 100644
--- a/src/cmd/internal/gc/swt.go
+++ b/src/cmd/internal/gc/swt.go
@@ -35,9 +35,7 @@ type Case struct {
var C *Case
func dumpcase(c0 *Case) {
- var c *Case
-
- for c = c0; c != nil; c = c.link {
+ for c := c0; c != nil; c = c.link {
switch c.type_ {
case Tdefault:
fmt.Printf("case-default\n")
@@ -104,11 +102,6 @@ func ordlcmp(c1 *Case, c2 *Case) int {
}
func exprcmp(c1 *Case, c2 *Case) int {
- var ct int
- var n int
- var n1 *Node
- var n2 *Node
-
// sort non-constants last
if c1.type_ != Texprconst {
return +1
@@ -117,11 +110,11 @@ func exprcmp(c1 *Case, c2 *Case) int {
return -1
}
- n1 = c1.node.Left
- n2 = c2.node.Left
+ n1 := c1.node.Left
+ n2 := c2.node.Left
// sort by type (for switches on interface)
- ct = int(n1.Val.Ctype)
+ ct := int(n1.Val.Ctype)
if ct != int(n2.Val.Ctype) {
return ct - int(n2.Val.Ctype)
@@ -135,7 +128,7 @@ func exprcmp(c1 *Case, c2 *Case) int {
}
// sort by constant value
- n = 0
+ n := 0
switch ct {
case CTFLT:
@@ -181,16 +174,12 @@ func typecmp(c1 *Case, c2 *Case) int {
}
func csort(l *Case, f func(*Case, *Case) int) *Case {
- var l1 *Case
- var l2 *Case
- var le *Case
-
if l == nil || l.link == nil {
return l
}
- l1 = l
- l2 = l
+ l1 := l
+ l2 := l
for {
l2 = l2.link
if l2 == nil {
@@ -217,7 +206,7 @@ func csort(l *Case, f func(*Case, *Case) int) *Case {
l2 = l2.link
}
- le = l
+ le := l
for {
if l1 == nil {
@@ -270,31 +259,24 @@ func newlabel_swt() *Node {
* deal with fallthrough, break, unreachable statements
*/
func casebody(sw *Node, typeswvar *Node) {
- var n *Node
- var c *Node
- var last *Node
- var def *Node
- var cas *NodeList
- var stat *NodeList
- var l *NodeList
- var lc *NodeList
- var go_ *Node
- var br *Node
- var lno int32
- var needvar bool
-
if sw.List == nil {
return
}
- lno = setlineno(sw)
+ lno := setlineno(sw)
- cas = nil // cases
- stat = nil // statements
- def = nil // defaults
- br = Nod(OBREAK, nil, nil)
+ cas := (*NodeList)(nil) // cases
+ stat := (*NodeList)(nil) // statements
+ def := (*Node)(nil) // defaults
+ br := Nod(OBREAK, nil, nil)
- for l = sw.List; l != nil; l = l.Next {
+ var c *Node
+ var go_ *Node
+ var needvar bool
+ var lc *NodeList
+ var last *Node
+ var n *Node
+ for l := sw.List; l != nil; l = l.Next {
n = l.N
setlineno(n)
if n.Op != OXCASE {
@@ -333,9 +315,7 @@ func casebody(sw *Node, typeswvar *Node) {
stat = list(stat, Nod(OLABEL, go_.Left, nil))
if typeswvar != nil && needvar && n.Nname != nil {
- var l *NodeList
-
- l = list1(Nod(ODCL, n.Nname, nil))
+ l := list1(Nod(ODCL, n.Nname, nil))
l = list(l, Nod(OAS, n.Nname, typeswvar))
typechecklist(l, Etop)
stat = concat(stat, l)
@@ -375,16 +355,12 @@ func casebody(sw *Node, typeswvar *Node) {
func mkcaselist(sw *Node, arg int) *Case {
var n *Node
- var c *Case
var c1 *Case
- var c2 *Case
- var l *NodeList
- var ord int
- c = nil
- ord = 0
+ c := (*Case)(nil)
+ ord := 0
- for l = sw.List; l != nil; l = l.Next {
+ for l := sw.List; l != nil; l = l.Next {
n = l.N
c1 = new(Case)
c1.link = c
@@ -444,7 +420,8 @@ func mkcaselist(sw *Node, arg int) *Case {
switch arg {
case Stype:
c = csort(c, typecmp)
- for c1 = c; c1 != nil; c1 = c1.link {
+ var c2 *Case
+ for c1 := c; c1 != nil; c1 = c1.link {
for c2 = c1.link; c2 != nil && c2.hash == c1.hash; c2 = c2.link {
if c1.type_ == Ttypenil || c1.type_ == Tdefault {
break
@@ -463,7 +440,7 @@ func mkcaselist(sw *Node, arg int) *Case {
Strue,
Sfalse:
c = csort(c, exprcmp)
- for c1 = c; c1.link != nil; c1 = c1.link {
+ for c1 := c; c1.link != nil; c1 = c1.link {
if exprcmp(c1, c1.link) != 0 {
continue
}
@@ -481,17 +458,12 @@ func mkcaselist(sw *Node, arg int) *Case {
var exprname *Node
func exprbsw(c0 *Case, ncase int, arg int) *Node {
- var cas *NodeList
- var a *Node
- var n *Node
- var c *Case
- var i int
- var half int
- var lno int
-
- cas = nil
+ cas := (*NodeList)(nil)
if ncase < Ncase {
- for i = 0; i < ncase; i++ {
+ var a *Node
+ var n *Node
+ var lno int
+ for i := 0; i < ncase; i++ {
n = c0.node
lno = int(setlineno(n))
@@ -520,13 +492,13 @@ func exprbsw(c0 *Case, ncase int, arg int) *Node {
}
// find the middle and recur
- c = c0
+ c := c0
- half = ncase >> 1
- for i = 1; i < half; i++ {
+ half := ncase >> 1
+ for i := 1; i < half; i++ {
c = c.link
}
- a = Nod(OIF, nil, nil)
+ a := Nod(OIF, nil, nil)
a.Ntest = Nod(OLE, exprname, c.node.Left)
typecheck(&a.Ntest, Erv)
a.Nbody = list1(exprbsw(c0, half, arg))
@@ -539,19 +511,9 @@ func exprbsw(c0 *Case, ncase int, arg int) *Node {
* rebuild case statements into if .. goto
*/
func exprswitch(sw *Node) {
- var def *Node
- var cas *NodeList
- var a *Node
- var c0 *Case
- var c *Case
- var c1 *Case
- var t *Type
- var arg int
- var ncase int
-
casebody(sw, nil)
- arg = Snorm
+ arg := Snorm
if Isconst(sw.Ntest, CTBOOL) {
arg = Strue
if sw.Ntest.Val.U.Bval == 0 {
@@ -560,7 +522,7 @@ func exprswitch(sw *Node) {
}
walkexpr(&sw.Ntest, &sw.Ninit)
- t = sw.Type
+ t := sw.Type
if t == nil {
return
}
@@ -570,7 +532,7 @@ func exprswitch(sw *Node) {
*/
exprname = nil
- cas = nil
+ cas := (*NodeList)(nil)
if arg == Strue || arg == Sfalse {
exprname = Nodbool(arg == Strue)
} else if consttype(sw.Ntest) >= 0 {
@@ -582,7 +544,8 @@ func exprswitch(sw *Node) {
typechecklist(cas, Etop)
}
- c0 = mkcaselist(sw, arg)
+ c0 := mkcaselist(sw, arg)
+ var def *Node
if c0 != nil && c0.type_ == Tdefault {
def = c0.node.Right
c0 = c0.link
@@ -590,6 +553,10 @@ func exprswitch(sw *Node) {
def = Nod(OBREAK, nil, nil)
}
+ var c *Case
+ var a *Node
+ var ncase int
+ var c1 *Case
loop:
if c0 == nil {
cas = list(cas, def)
@@ -639,13 +606,8 @@ var facename *Node
var boolname *Node
func typeone(t *Node) *Node {
- var init *NodeList
- var a *Node
- var b *Node
- var var_ *Node
-
- var_ = t.Nname
- init = nil
+ var_ := t.Nname
+ init := (*NodeList)(nil)
if var_ == nil {
typecheck(&nblank, Erv|Easgn)
var_ = nblank
@@ -653,9 +615,9 @@ func typeone(t *Node) *Node {
init = list1(Nod(ODCL, var_, nil))
}
- a = Nod(OAS2, nil, nil)
+ a := Nod(OAS2, nil, nil)
a.List = list(list1(var_), boolname) // var,bool =
- b = Nod(ODOTTYPE, facename, nil)
+ b := Nod(ODOTTYPE, facename, nil)
b.Type = t.Left.Type // interface.(type)
a.Rlist = list1(b)
typecheck(&a, Etop)
@@ -669,17 +631,12 @@ func typeone(t *Node) *Node {
}
func typebsw(c0 *Case, ncase int) *Node {
- var cas *NodeList
- var a *Node
- var n *Node
- var c *Case
- var i int
- var half int
-
- cas = nil
+ cas := (*NodeList)(nil)
if ncase < Ncase {
- for i = 0; i < ncase; i++ {
+ var n *Node
+ var a *Node
+ for i := 0; i < ncase; i++ {
n = c0.node
if c0.type_ != Ttypeconst {
Fatal("typebsw")
@@ -696,13 +653,13 @@ func typebsw(c0 *Case, ncase int) *Node {
}
// find the middle and recur
- c = c0
+ c := c0
- half = ncase >> 1
- for i = 1; i < half; i++ {
+ half := ncase >> 1
+ for i := 1; i < half; i++ {
c = c.link
}
- a = Nod(OIF, nil, nil)
+ a := Nod(OIF, nil, nil)
a.Ntest = Nod(OLE, hashname, Nodintconst(int64(c.hash)))
typecheck(&a.Ntest, Erv)
a.Nbody = list1(typebsw(c0, half))
@@ -716,18 +673,6 @@ func typebsw(c0 *Case, ncase int) *Node {
* into if statements
*/
func typeswitch(sw *Node) {
- var def *Node
- var cas *NodeList
- var hash *NodeList
- var a *Node
- var n *Node
- var c *Case
- var c0 *Case
- var c1 *Case
- var ncase int
- var t *Type
- var v Val
-
if sw.Ntest == nil {
return
}
@@ -743,7 +688,7 @@ func typeswitch(sw *Node) {
return
}
- cas = nil
+ cas := (*NodeList)(nil)
/*
* predeclare temporary variables
@@ -751,7 +696,7 @@ func typeswitch(sw *Node) {
*/
facename = temp(sw.Ntest.Right.Type)
- a = Nod(OAS, facename, sw.Ntest.Right)
+ a := Nod(OAS, facename, sw.Ntest.Right)
typecheck(&a, Etop)
cas = list(cas, a)
@@ -763,7 +708,7 @@ func typeswitch(sw *Node) {
hashname = temp(Types[TUINT32])
typecheck(&hashname, Erv)
- t = sw.Ntest.Right.Type
+ t := sw.Ntest.Right.Type
if isnilinter(t) {
a = syslook("efacethash", 1)
} else {
@@ -776,7 +721,8 @@ func typeswitch(sw *Node) {
typecheck(&a, Etop)
cas = list(cas, a)
- c0 = mkcaselist(sw, Stype)
+ c0 := mkcaselist(sw, Stype)
+ var def *Node
if c0 != nil && c0.type_ == Tdefault {
def = c0.node.Right
c0 = c0.link
@@ -787,7 +733,9 @@ func typeswitch(sw *Node) {
/*
* insert if statement into each case block
*/
- for c = c0; c != nil; c = c.link {
+ var v Val
+ var n *Node
+ for c := c0; c != nil; c = c.link {
n = c.node
switch c.type_ {
case Ttypenil:
@@ -807,6 +755,10 @@ func typeswitch(sw *Node) {
/*
* generate list of if statements, binary search for constant sequences
*/
+ var ncase int
+ var c1 *Case
+ var hash *NodeList
+ var c *Case
for c0 != nil {
if c0.type_ != Ttypeconst {
n = c0.node
@@ -895,22 +847,11 @@ func walkswitch(sw *Node) {
*/
func typecheckswitch(n *Node) {
var top int
- var lno int
- var ptr int
- var nilonly string
var t *Type
- var badtype *Type
- var missing *Type
- var have *Type
- var l *NodeList
- var ll *NodeList
- var ncase *Node
- var nvar *Node
- var def *Node
- lno = int(lineno)
+ lno := int(lineno)
typechecklist(n.Ninit, Etop)
- nilonly = ""
+ nilonly := ""
if n.Ntest != nil && n.Ntest.Op == OTYPESW {
// type switch
@@ -933,6 +874,7 @@ func typecheckswitch(n *Node) {
t = Types[TBOOL]
}
if t != nil {
+ var badtype *Type
if okforeq[t.Etype] == 0 {
Yyerror("cannot switch on %v", Nconv(n.Ntest, obj.FmtLong))
} else if t.Etype == TARRAY && !Isfixedarray(t) {
@@ -951,8 +893,14 @@ func typecheckswitch(n *Node) {
n.Type = t
- def = nil
- for l = n.List; l != nil; l = l.Next {
+ def := (*Node)(nil)
+ var ptr int
+ var have *Type
+ var nvar *Node
+ var ll *NodeList
+ var missing *Type
+ var ncase *Node
+ for l := n.List; l != nil; l = l.Next {
ncase = l.N
setlineno(n)
if ncase.List == nil {