]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: Fix Copy of arrays
authorGustavo Niemeyer <gustavo@niemeyer.net>
Wed, 27 Apr 2011 21:22:53 +0000 (18:22 -0300)
committerGustavo Niemeyer <gustavo@niemeyer.net>
Wed, 27 Apr 2011 21:22:53 +0000 (18:22 -0300)
R=golang-dev, rsc1
CC=golang-dev
https://golang.org/cl/4438077

src/pkg/reflect/all_test.go
src/pkg/reflect/value.go

index f510294c2a709bdd9a8260cd06ae8d7403f3c705..5bf65333c915dd3a6a6163ff63cd2a5c23b97632 100644 (file)
@@ -565,6 +565,33 @@ func TestCopy(t *testing.T) {
        }
 }
 
+func TestCopyArray(t *testing.T) {
+       a := [8]int{1, 2, 3, 4, 10, 9, 8, 7}
+       b := [11]int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
+       c := b
+       aa := ValueOf(&a).Elem()
+       ab := ValueOf(&b).Elem()
+       Copy(ab, aa)
+       for i := 0; i < len(a); i++ {
+               if a[i] != b[i] {
+                       t.Errorf("(i) a[%d]=%d, b[%d]=%d", i, a[i], i, b[i])
+               }
+       }
+       for i := len(a); i < len(b); i++ {
+               if b[i] != c[i] {
+                       if i < len(a) {
+                               t.Errorf("(ii) a[%d]=%d, b[%d]=%d, c[%d]=%d",
+                                       i, a[i], i, b[i], i, c[i])
+                       } else {
+                               t.Errorf("(iii) b[%d]=%d, c[%d]=%d",
+                                       i, b[i], i, c[i])
+                       }
+               } else {
+                       t.Logf("elem %d is okay\n", i)
+               }
+       }
+}
+
 func TestBigUnnamedStruct(t *testing.T) {
        b := struct{ a, b, c, d int64 }{1, 2, 3, 4}
        v := ValueOf(b)
index 9ee957e713f779d25df88f2d775e9ff1fecde400..6dffb07833f304847aa312533c593b36d9efd49d 100644 (file)
@@ -1546,7 +1546,7 @@ func Copy(dst, src Value) int {
        // Copy via memmove.
        var da, sa unsafe.Pointer
        if idst.kind == Array {
-               da = isrc.addr
+               da = idst.addr
        } else {
                da = unsafe.Pointer((*SliceHeader)(idst.addr).Data)
        }