]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: add unit test for cmpstackvar
authorHÃ¥vard Haugen <havard.haugen@gmail.com>
Tue, 15 Sep 2015 19:43:53 +0000 (21:43 +0200)
committerDave Cheney <dave@cheney.net>
Thu, 17 Sep 2015 23:46:38 +0000 (23:46 +0000)
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 <dave@cheney.net>
src/cmd/compile/internal/gc/pgen.go
src/cmd/compile/internal/gc/pgen_test.go [new file with mode: 0644]

index 9b3ef68207b76751d68d91a6b472480dac8eb924..7c918c5d376c831c8adab304aaed4771a76ce118 100644 (file)
@@ -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 (file)
index 0000000..ce8b2b3
--- /dev/null
@@ -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)
+               }
+       }
+}