Browse Source
bpo-38075: Fix random_seed(): use PyObject_CallOneArg() (GH-18897)
Fix the random.Random.seed() method when a bool is passed as the
seed.
PyObject_Vectorcall() was misused: use PyObject_CallOneArg() instead.
pull/18889/merge
Victor Stinner
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
4 additions and
5 deletions
-
Lib/test/test_random.py
-
Misc/NEWS.d/next/Library/2020-03-10-12-52-06.bpo-38075.qbESAF.rst
-
Modules/_randommodule.c
|
|
|
@ -42,7 +42,7 @@ class TestBasicOps: |
|
|
|
def __hash__(self): |
|
|
|
return -1729 |
|
|
|
for arg in [None, 0, 1, -1, 10**20, -(10**20), |
|
|
|
3.14, 'a']: |
|
|
|
False, True, 3.14, 'a']: |
|
|
|
self.gen.seed(arg) |
|
|
|
|
|
|
|
for arg in [1+2j, tuple('abc'), MySeed()]: |
|
|
|
|
|
|
|
@ -0,0 +1,2 @@ |
|
|
|
Fix the :meth:`random.Random.seed` method when a :class:`bool` is passed as the |
|
|
|
seed. |
|
|
|
@ -264,7 +264,6 @@ random_seed(RandomObject *self, PyObject *arg) |
|
|
|
uint32_t *key = NULL; |
|
|
|
size_t bits, keyused; |
|
|
|
int res; |
|
|
|
PyObject *args[1]; |
|
|
|
|
|
|
|
if (arg == NULL || arg == Py_None) { |
|
|
|
if (random_seed_urandom(self) < 0) { |
|
|
|
@ -286,9 +285,7 @@ random_seed(RandomObject *self, PyObject *arg) |
|
|
|
} else if (PyLong_Check(arg)) { |
|
|
|
/* Calling int.__abs__() prevents calling arg.__abs__(), which might |
|
|
|
return an invalid value. See issue #31478. */ |
|
|
|
args[0] = arg; |
|
|
|
n = PyObject_Vectorcall(_randomstate_global->Long___abs__, args, 0, |
|
|
|
NULL); |
|
|
|
n = PyObject_CallOneArg(_randomstate_global->Long___abs__, arg); |
|
|
|
} |
|
|
|
else { |
|
|
|
Py_hash_t hash = PyObject_Hash(arg); |
|
|
|
|