Commit d5960e30 authored by Daniel Martí's avatar Daniel Martí

cmd/compile: turn some pointer params into results

These are likely from the time when gc was written in C. There is no
need for any of these to be passed pointers, as the previous values are
not kept in any way, and the pointers are never nil. Others were left
untouched as they fell into one of these useful cases.

While at it, also turn some 0/1 integers into booleans.

Passes toolstash -cmp on std cmd.

Change-Id: Id3a9c9e84ef89536c4dc69a7fdbacd0fd7a76a9b
Reviewed-on: https://go-review.googlesource.com/72990
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent f3884680
......@@ -13,7 +13,7 @@ import (
// range
func typecheckrange(n *Node) {
var toomany int
var toomany bool
var why string
var t1 *types.Type
var t2 *types.Type
......@@ -50,7 +50,7 @@ func typecheckrange(n *Node) {
}
n.Type = t
toomany = 0
toomany = false
switch t.Etype {
default:
yyerrorl(n.Pos, "cannot range over %L", n.Right)
......@@ -73,7 +73,7 @@ func typecheckrange(n *Node) {
t1 = t.Elem()
t2 = nil
if n.List.Len() == 2 {
toomany = 1
toomany = true
}
case TSTRING:
......@@ -81,7 +81,7 @@ func typecheckrange(n *Node) {
t2 = types.Runetype
}
if n.List.Len() > 2 || toomany != 0 {
if n.List.Len() > 2 || toomany {
yyerrorl(n.Pos, "too many variables in range")
}
......
......@@ -1800,35 +1800,32 @@ func hashmem(t *types.Type) *Node {
return n
}
func ifacelookdot(s *types.Sym, t *types.Type, followptr *bool, ignorecase bool) *types.Field {
*followptr = false
func ifacelookdot(s *types.Sym, t *types.Type, ignorecase bool) (m *types.Field, followptr bool) {
if t == nil {
return nil
return nil, false
}
var m *types.Field
path, ambig := dotpath(s, t, &m, ignorecase)
if path == nil {
if ambig {
yyerror("%v.%v is ambiguous", t, s)
}
return nil
return nil, false
}
for _, d := range path {
if d.field.Type.IsPtr() {
*followptr = true
followptr = true
break
}
}
if m.Type.Etype != TFUNC || m.Type.Recv() == nil {
yyerror("%v.%v is a field, not a method", t, s)
return nil
return nil, followptr
}
return m
return m, followptr
}
func implements(t, iface *types.Type, m, samename **types.Field, ptr *int) bool {
......@@ -1873,11 +1870,10 @@ func implements(t, iface *types.Type, m, samename **types.Field, ptr *int) bool
if im.Broke() {
continue
}
var followptr bool
tm := ifacelookdot(im.Sym, t, &followptr, false)
tm, followptr := ifacelookdot(im.Sym, t, false)
if tm == nil || tm.Nointerface() || !eqtype(tm.Type, im.Type) {
if tm == nil {
tm = ifacelookdot(im.Sym, t, &followptr, true)
tm, followptr = ifacelookdot(im.Sym, t, true)
}
*m = im
*samename = tm
......
......@@ -3910,17 +3910,17 @@ func (n *Node) isterminating() bool {
if n.HasBreak() {
return false
}
def := 0
def := false
for _, n1 := range n.List.Slice() {
if !n1.Nbody.isterminating() {
return false
}
if n1.List.Len() == 0 { // default
def = 1
def = true
}
}
if n.Op != OSELECT && def == 0 {
if n.Op != OSELECT && !def {
return false
}
return true
......
......@@ -2481,9 +2481,8 @@ func aliased(n *Node, all []*Node, i int) bool {
// Also record whether there are any writes to main memory.
// Also record whether there are any writes to variables
// whose addresses have been taken.
memwrite := 0
varwrite := 0
memwrite := false
varwrite := false
for _, an := range all[:i] {
a := outervalue(an.Left)
......@@ -2492,18 +2491,18 @@ func aliased(n *Node, all []*Node, i int) bool {
}
if a.Op != ONAME {
memwrite = 1
memwrite = true
continue
}
switch n.Class() {
default:
varwrite = 1
varwrite = true
continue
case PAUTO, PPARAM, PPARAMOUT:
if n.Addrtaken() {
varwrite = 1
varwrite = true
continue
}
......@@ -2519,7 +2518,7 @@ func aliased(n *Node, all []*Node, i int) bool {
// that are being written.
// If no computed addresses are affected by the writes, no aliasing.
if memwrite == 0 && varwrite == 0 {
if !memwrite && !varwrite {
return false
}
......@@ -3208,7 +3207,7 @@ func copyany(n *Node, init *Nodes, runtimecall bool) *Node {
return nlen
}
func eqfor(t *types.Type, needsize *int) *Node {
func eqfor(t *types.Type) (n *Node, needsize bool) {
// Should only arrive here with large memory or
// a struct/array containing a non-memory field/element.
// Small memory is handled inline, and single non-memory
......@@ -3217,8 +3216,7 @@ func eqfor(t *types.Type, needsize *int) *Node {
case AMEM:
n := syslook("memequal")
n = substArgTypes(n, t, t)
*needsize = 1
return n
return n, true
case ASPECIAL:
sym := typesymprefix(".eq", t)
n := newname(sym)
......@@ -3229,11 +3227,10 @@ func eqfor(t *types.Type, needsize *int) *Node {
ntype.Rlist.Append(anonfield(types.Types[TBOOL]))
ntype = typecheck(ntype, Etype)
n.Type = ntype.Type
*needsize = 0
return n
return n, false
}
Fatalf("eqfor %v", t)
return nil
return nil, false
}
// The result of walkcompare MUST be assigned back to n, e.g.
......@@ -3353,11 +3350,11 @@ func walkcompare(n *Node, init *Nodes) *Node {
ar = typecheck(ar, Etop)
init.Append(ar)
var needsize int
call := nod(OCALL, eqfor(t, &needsize), nil)
fn, needsize := eqfor(t)
call := nod(OCALL, fn, nil)
call.List.Append(pl)
call.List.Append(pr)
if needsize != 0 {
if needsize {
call.List.Append(nodintconst(t.Width))
}
res := call
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment