diff options
| author | Jeff Epler <jepler@gmail.com> | 2020-04-28 09:13:49 -0500 |
|---|---|---|
| committer | Jeff Epler <jepler@gmail.com> | 2020-09-06 09:53:16 -0500 |
| commit | 20c2dd0c0853f3f1f6a5fa23887f08ec5cf77818 (patch) | |
| tree | d35a27568356cc03ac25769daa404ddde21f7de9 /py/objint_longlong.c | |
| parent | 5d17d6402d57a74e20ea332da6a31be65ec0e2ca (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.c | 11 |
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) { |
