diff --git a/extmod/modurandom.c b/extmod/modurandom.c index 5a736c1eb..f44510be9 100644 --- a/extmod/modurandom.c +++ b/extmod/modurandom.c @@ -88,7 +88,7 @@ STATIC uint32_t yasmarang_randbelow(uint32_t n) { STATIC mp_obj_t mod_urandom_getrandbits(mp_obj_t num_in) { int n = mp_obj_get_int(num_in); if (n > 32 || n == 0) { - mp_raise_ValueError(NULL); + mp_raise_ValueError(MP_ERROR_TEXT("bits must be 32 or less")); } uint32_t mask = ~0; // Beware of C undefined behavior when shifting by >= than bit size diff --git a/tests/cpydiff/modules_random_getrandbits.py b/tests/cpydiff/modules_random_getrandbits.py new file mode 100644 index 000000000..523e3a329 --- /dev/null +++ b/tests/cpydiff/modules_random_getrandbits.py @@ -0,0 +1,12 @@ +""" +categories: Modules,random +description: ``getrandbits`` method can only return a maximum of 32 bits at a time. +cause: PRNG's internal state is only 32bits so it can only return a maximum of 32 bits of data at a time. +workaround: If you need a number that has more than 32 bits then utilize the random module from micropython-lib. +""" + +import random + + +x = random.getrandbits(64) +print("{}".format(x)) diff --git a/tests/cpydiff/modules_random_randint.py b/tests/cpydiff/modules_random_randint.py new file mode 100644 index 000000000..b05908a15 --- /dev/null +++ b/tests/cpydiff/modules_random_randint.py @@ -0,0 +1,12 @@ +""" +categories: Modules,random +description: ``randint`` method can only return an integer that is at most the native word size. +cause: PRNG is only able to generate 32 bits of state at a time. The result is then cast into a native sized int instead of a full int object. +workaround: If you need integers larger than native wordsize use the random module from micropython-lib. +""" + +import random + + +x = random.randint(2 ** 128 - 1, 2 ** 128) +print("x={}".format(x)) diff --git a/tests/cpydiff/types_int_bit_length.py b/tests/cpydiff/types_int_bit_length.py new file mode 100644 index 000000000..2e907745a --- /dev/null +++ b/tests/cpydiff/types_int_bit_length.py @@ -0,0 +1,9 @@ +""" +categories: Types,int +description: ``bit_length`` method doesn't exist. +cause: bit_length method is not implemented. +workaround: Avoid using this method on MicroPython. +""" + +x = 255 +print("{} is {} bits long.".format(x, x.bit_length()))