]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix inconsistency in slice.go
authorMarvin Stenger <marvin.stenger94@gmail.com>
Thu, 24 Mar 2016 00:55:42 +0000 (01:55 +0100)
committerIan Lance Taylor <iant@golang.org>
Thu, 24 Mar 2016 18:17:28 +0000 (18:17 +0000)
Fixes #14938.

Additionally some simplifications along the way.

Change-Id: I2c5fb7e32dcc6fab68fff36a49cb72e715756abe
Reviewed-on: https://go-review.googlesource.com/21046
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>

src/runtime/slice.go

index 5e88ed945395fb048ac584913583121bfe03ea04..d35ecadb16aaaa3407dde1118546d5ab707f7ee6 100644 (file)
@@ -62,23 +62,20 @@ func growslice(t *slicetype, old slice, cap int) slice {
        }
 
        newcap := old.cap
-       if newcap+newcap < cap {
+       doublecap := newcap + newcap
+       if cap > doublecap {
                newcap = cap
        } else {
-               for {
-                       if old.len < 1024 {
-                               newcap += newcap
-                       } else {
+               if old.len < 1024 {
+                       newcap = doublecap
+               } else {
+                       for newcap < cap {
                                newcap += newcap / 4
                        }
-                       if newcap >= cap {
-                               break
-                       }
                }
-       }
-
-       if uintptr(newcap) >= maxcap {
-               panic(errorString("growslice: cap out of range"))
+               if uintptr(newcap) > maxcap {
+                       panic(errorString("growslice: cap out of range"))
+               }
        }
 
        lenmem := uintptr(old.len) * et.size