]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: correct iteration of large map values
authorRuss Cox <rsc@golang.org>
Wed, 6 Oct 2010 15:54:41 +0000 (11:54 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 6 Oct 2010 15:54:41 +0000 (11:54 -0400)
The hash_next_and_deref was a dreg from a
previous large value scheme.

Fixes #1163.

R=r, r2
CC=golang-dev
https://golang.org/cl/2369043

src/pkg/runtime/hashmap.c
test/fixedbugs/bug311.go [new file with mode: 0644]

index eb98ab54aa27d04713814fa771d39c349597ae0c..704196c2d2153b04a83354b9411b6cbba7288690 100644 (file)
@@ -920,17 +920,6 @@ void
        }
 }
 
-void*
-hash_next_and_deref(struct hash_iter *it)
-{
-       void *p;
-
-       p = hash_next(it);
-       if(it->h->indirectval)
-               p = *(void**)p;
-       return p;
-}
-
 // mapiterinit(hmap *map[any]any, hiter *any);
 void
 ·mapiterinit(Hmap *h, struct hash_iter *it)
@@ -940,7 +929,7 @@ void
                return;
        }
        hash_iter_init(h, it);
-       it->data = hash_next_and_deref(it);
+       it->data = hash_next(it);
        if(debug) {
                prints("runtime.mapiterinit: map=");
                ·printpointer(h);
@@ -969,7 +958,7 @@ void
        if(gcwaiting)
                gosched();
 
-       it->data = hash_next_and_deref(it);
+       it->data = hash_next(it);
        if(debug) {
                prints("runtime.mapiternext: iter=");
                ·printpointer(it);
diff --git a/test/fixedbugs/bug311.go b/test/fixedbugs/bug311.go
new file mode 100644 (file)
index 0000000..ed937a6
--- /dev/null
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2010 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 main
+
+func main() {
+       m := make(map[string][1000]byte)
+       m["hi"] = [1000]byte{1}
+       
+       v := m["hi"]
+       
+       for k, vv := range m {
+               if k != "hi" || string(v[:]) != string(vv[:]) {
+                       panic("bad iter")
+               }
+       }
+}