summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extmod/modurandom.c2
-rw-r--r--tests/cpydiff/modules_random_getrandbits.py12
-rw-r--r--tests/cpydiff/modules_random_randint.py12
-rw-r--r--tests/cpydiff/types_int_bit_length.py9
4 files changed, 34 insertions, 1 deletions
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()))