From f482a0f023365acfdf64f169438d5b8582952225 Mon Sep 17 00:00:00 2001 From: =?utf8?q?H=C3=A5vard=20Haugen?= Date: Tue, 15 Sep 2015 21:43:53 +0200 Subject: [PATCH] cmd/compile/internal/gc: add unit test for cmpstackvar A followup CL will rewrite listsort to use the new cmpstackvarlt and change cmpstackvar to avoid stringsCompare. Change-Id: Idf0857a3bd67f9e2243ba82aa0bff510612927c3 Reviewed-on: https://go-review.googlesource.com/14611 Reviewed-by: Dave Cheney --- src/cmd/compile/internal/gc/pgen.go | 5 ++ src/cmd/compile/internal/gc/pgen_test.go | 102 +++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/cmd/compile/internal/gc/pgen_test.go diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 9b3ef68207..7c918c5d37 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -164,6 +164,11 @@ func emitptrargsmap() { ggloblsym(sym, int32(off), obj.RODATA|obj.LOCAL) } +// cmpstackvarlt reports whether the stack variable a sorts before b. +func cmpstackvarlt(a, b *Node) bool { + return cmpstackvar(a, b) < 0 +} + // Sort the list of stack variables. Autos after anything else, // within autos, unused after used, within used, things with // pointers first, zeroed things first, and then decreasing size. diff --git a/src/cmd/compile/internal/gc/pgen_test.go b/src/cmd/compile/internal/gc/pgen_test.go new file mode 100644 index 0000000000..ce8b2b3aeb --- /dev/null +++ b/src/cmd/compile/internal/gc/pgen_test.go @@ -0,0 +1,102 @@ +// 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 "testing" + +// Test all code paths for cmpstackvarlt. +func TestCmpstackvar(t *testing.T) { + testdata := []struct { + a, b Node + lt bool + }{ + { + Node{Class: PAUTO}, + Node{Class: PFUNC}, + false, + }, + { + Node{Class: PFUNC}, + Node{Class: PAUTO}, + true, + }, + { + Node{Class: PFUNC, Xoffset: 0}, + Node{Class: PFUNC, Xoffset: 10}, + true, + }, + { + Node{Class: PFUNC, Xoffset: 20}, + Node{Class: PFUNC, Xoffset: 10}, + false, + }, + { + Node{Class: PFUNC, Xoffset: 10}, + Node{Class: PFUNC, Xoffset: 10}, + false, + }, + { + Node{Class: PAUTO, Used: true}, + Node{Class: PAUTO, Used: false}, + true, + }, + { + Node{Class: PAUTO, Used: false}, + Node{Class: PAUTO, Used: true}, + false, + }, + { + Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false + Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true + false, + }, + { + Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true + Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false + true, + }, + { + Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}}, + Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}}, + true, + }, + { + Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}}, + Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}}, + false, + }, + { + Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}}, + Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}}, + false, + }, + { + Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}}, + Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}}, + true, + }, + { + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}}, + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}}, + true, + }, + { + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}}, + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}}, + false, + }, + { + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}}, + Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}}, + false, + }, + } + for _, d := range testdata { + got := cmpstackvarlt(&d.a, &d.b) + if got != d.lt { + t.Errorf("want %#v < %#v", d.a, d.b) + } + } +} -- 2.48.1