From c73df92be6dd24603fe51f90db668980a7a9ef19 Mon Sep 17 00:00:00 2001 From: =?utf8?q?H=C3=A5vard=20Haugen?= Date: Wed, 23 Sep 2015 23:31:17 +0200 Subject: [PATCH] cmd/compile/internal/gc: remove stringsCompare Inlined the last occurrence of stringsCompare into exprcmp. Passes go build -a -toolexec 'toolstash -cmp' std cmd. Change-Id: I8fd99e3fbffc84283cc269368595cba950533066 Reviewed-on: https://go-review.googlesource.com/14872 Reviewed-by: Dave Cheney Run-TryBot: Dave Cheney TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/swt.go | 8 +- src/cmd/compile/internal/gc/swt_test.go | 144 ++++++++++++++++++++++++ src/cmd/compile/internal/gc/util.go | 11 -- 3 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 src/cmd/compile/internal/gc/swt_test.go diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go index f5952fc3dc..9ed30b2a82 100644 --- a/src/cmd/compile/internal/gc/swt.go +++ b/src/cmd/compile/internal/gc/swt.go @@ -778,7 +778,13 @@ func exprcmp(c1, c2 *caseClause) int { if len(a) > len(b) { return +1 } - return stringsCompare(a, b) + if a == b { + return 0 + } + if a < b { + return -1 + } + return +1 } return 0 diff --git a/src/cmd/compile/internal/gc/swt_test.go b/src/cmd/compile/internal/gc/swt_test.go new file mode 100644 index 0000000000..c1ee8955cf --- /dev/null +++ b/src/cmd/compile/internal/gc/swt_test.go @@ -0,0 +1,144 @@ +// Copyright 2015 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 gc + +import ( + "cmd/compile/internal/big" + "testing" +) + +func TestExprcmp(t *testing.T) { + testdata := []struct { + a, b caseClause + want int + }{ + // Non-constants. + { + caseClause{node: Nod(OXXX, nil, nil), typ: caseKindExprVar}, + caseClause{node: Nod(OXXX, nil, nil), typ: caseKindExprConst}, + +1, + }, + { + caseClause{node: Nod(OXXX, nil, nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nil, nil), typ: caseKindExprVar}, + -1, + }, + // Type switches + { + caseClause{node: Nod(OXXX, Nodintconst(0), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, Nodbool(true), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, Nodbool(true), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, Nodintconst(1), nil), typ: caseKindExprConst}, + +1, + }, + { + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TBOOL, Vargen: 1}}, nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TINT, Vargen: 0}}, nil), typ: caseKindExprConst}, + +1, + }, + { + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TBOOL, Vargen: 1}}, nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TINT, Vargen: 1}}, nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TBOOL, Vargen: 0}}, nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, &Node{Type: &Type{Etype: TINT, Vargen: 1}}, nil), typ: caseKindExprConst}, + -1, + }, + // Constant values. + // CTFLT + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.1)}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.2)}}), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.1)}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.1)}}), nil), typ: caseKindExprConst}, + 0, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.2)}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpflt{Val: *big.NewFloat(0.1)}}), nil), typ: caseKindExprConst}, + +1, + }, + // CTINT + { + caseClause{node: Nod(OXXX, Nodintconst(0), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, Nodintconst(1), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, Nodintconst(1), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, Nodintconst(1), nil), typ: caseKindExprConst}, + 0, + }, + { + caseClause{node: Nod(OXXX, Nodintconst(1), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, Nodintconst(0), nil), typ: caseKindExprConst}, + +1, + }, + // CTRUNE + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('a'), Rune: true}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('b'), Rune: true}}), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('b'), Rune: true}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('b'), Rune: true}}), nil), typ: caseKindExprConst}, + 0, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('b'), Rune: true}}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{&Mpint{Val: *big.NewInt('a'), Rune: true}}), nil), typ: caseKindExprConst}, + +1, + }, + // CTSTR + { + caseClause{node: Nod(OXXX, nodlit(Val{"ab"}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{"xyz"}), nil), typ: caseKindExprConst}, + -1, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + 0, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{"ab"}), nil), typ: caseKindExprConst}, + +1, + }, + { + caseClause{node: Nod(OXXX, nodlit(Val{"xyz"}), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodlit(Val{"abc"}), nil), typ: caseKindExprConst}, + +1, + }, + // Everything else should compare equal. + { + caseClause{node: Nod(OXXX, nodnil(), nil), typ: caseKindExprConst}, + caseClause{node: Nod(OXXX, nodnil(), nil), typ: caseKindExprConst}, + 0, + }, + } + for i, d := range testdata { + got := exprcmp(&d.a, &d.b) + if d.want != got { + t.Errorf("%d: exprcmp(a, b) = %d; want %d", i, got, d.want) + t.Logf("\ta = caseClause{node: %#v, typ: %#v}", d.a.node, d.a.typ) + t.Logf("\tb = caseClause{node: %#v, typ: %#v}", d.b.node, d.b.typ) + } + } +} diff --git a/src/cmd/compile/internal/gc/util.go b/src/cmd/compile/internal/gc/util.go index b75bc20518..6533c9aff9 100644 --- a/src/cmd/compile/internal/gc/util.go +++ b/src/cmd/compile/internal/gc/util.go @@ -17,17 +17,6 @@ func atoi(s string) int { return int(n) } -// strings.Compare, introduced in Go 1.5. -func stringsCompare(a, b string) int { - if a == b { - return 0 - } - if a < b { - return -1 - } - return +1 -} - var atExitFuncs []func() func AtExit(f func()) { -- 2.48.1