summaryrefslogtreecommitdiff
path: root/py/objint_longlong.c
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-04-28 09:13:49 -0500
committerJeff Epler <jepler@gmail.com>2020-09-06 09:53:16 -0500
commit20c2dd0c0853f3f1f6a5fa23887f08ec5cf77818 (patch)
treed35a27568356cc03ac25769daa404ddde21f7de9 /py/objint_longlong.c
parent5d17d6402d57a74e20ea332da6a31be65ec0e2ca (diff)
core: add int.bit_length() when MICROPY_CYPTHON_COMPAT is enabled
This method of integer objects is needed for a port of python3's decimal.py module. MICROPY_CPYTHON_COMPAT is enabled by CIRCUITPY_FULL_BUILD.
Diffstat (limited to 'py/objint_longlong.c')
-rw-r--r--py/objint_longlong.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/py/objint_longlong.c b/py/objint_longlong.c
index 189049630..0a65098c7 100644
--- a/py/objint_longlong.c
+++ b/py/objint_longlong.c
@@ -45,6 +45,17 @@
const mp_obj_int_t mp_maxsize_obj = {{&mp_type_int}, MP_SSIZE_MAX};
#endif
+mp_obj_t mp_obj_int_bit_length_impl(mp_obj_t self_in) {
+ assert(MP_OBJ_IS_TYPE(self_in, &mp_type_int));
+ mp_obj_int_t *self = self_in;
+ long long val = self->val;
+ return MP_OBJ_NEW_SMALL_INT(
+ (val == 0) ? 0 :
+ (val == MP_SMALL_INT_MIN) ? 8 * sizeof(long long) :
+ (val < 0) ? 8 * sizeof(long long) - __builtin_clzll(-val) :
+ 8 * sizeof(long long) - __builtin_clzll(val));
+}
+
mp_obj_t mp_obj_int_from_bytes_impl(bool big_endian, size_t len, const byte *buf) {
int delta = 1;
if (!big_endian) {