Commit fc78c5aa authored by Robert Griesemer's avatar Robert Griesemer

math/big: Rand shouldn't hang if argument is also receiver.

Fixes #2607.

R=rsc
CC=golang-dev
https://golang.org/cl/5489109
parent b6122b0a
......@@ -9,6 +9,7 @@ import (
"encoding/gob"
"encoding/hex"
"fmt"
"math/rand"
"testing"
"testing/quick"
)
......@@ -1405,3 +1406,9 @@ func TestIntGobEncoding(t *testing.T) {
}
}
}
func TestIssue2607(t *testing.T) {
// This code sequence used to hang.
n := NewInt(10)
n.Rand(rand.New(rand.NewSource(9)), n)
}
......@@ -1196,12 +1196,16 @@ func (x nat) powersOfTwoDecompose() (q nat, k int) {
// random creates a random integer in [0..limit), using the space in z if
// possible. n is the bit length of limit.
func (z nat) random(rand *rand.Rand, limit nat, n int) nat {
if alias(z, limit) {
z = nil // z is an alias for limit - cannot reuse
}
z = z.make(len(limit))
bitLengthOfMSW := uint(n % _W)
if bitLengthOfMSW == 0 {
bitLengthOfMSW = _W
}
mask := Word((1 << bitLengthOfMSW) - 1)
z = z.make(len(limit))
for {
for i := range z {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment