From d8cbbcaa9d057f210b192bde68fde551972e426c Mon Sep 17 00:00:00 2001 From: Damien George Date: Sun, 19 Apr 2015 12:26:46 +0100 Subject: [PATCH] py: Fix builtin ord so that it can handle bytes values >= 0x80. Addresses issue #1188. --- py/modbuiltins.c | 17 ++++++++++++----- tests/basics/builtin_ord.py | 13 +++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/py/modbuiltins.c b/py/modbuiltins.c index 877c655d6c..bec47787c8 100644 --- a/py/modbuiltins.c +++ b/py/modbuiltins.c @@ -351,9 +351,12 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) { mp_uint_t len; const char *str = mp_obj_str_get_data(o_in, &len); #if MICROPY_PY_BUILTINS_STR_UNICODE - len = unichar_charlen(str, len); - if (len == 1) { - if (MP_OBJ_IS_STR(o_in) && UTF8_IS_NONASCII(*str)) { + if (MP_OBJ_IS_STR(o_in)) { + len = unichar_charlen(str, len); + if (len == 1) { + if (!UTF8_IS_NONASCII(*str)) { + goto return_first_byte; + } mp_int_t ord = *str++ & 0x7F; for (mp_int_t mask = 0x40; ord & mask; mask >>= 1) { ord &= ~mask; @@ -362,8 +365,12 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) { ord = (ord << 6) | (*str++ & 0x3F); } return mp_obj_new_int(ord); - } else { - return mp_obj_new_int(((const byte*)str)[0]); + } + } else { + // a bytes object + if (len == 1) { + return_first_byte: + return MP_OBJ_NEW_SMALL_INT(((const byte*)str)[0]); } } #else diff --git a/tests/basics/builtin_ord.py b/tests/basics/builtin_ord.py index 6347aa4ec0..66e56e5c6f 100644 --- a/tests/basics/builtin_ord.py +++ b/tests/basics/builtin_ord.py @@ -7,3 +7,16 @@ try: except TypeError: print("TypeError") +# bytes also work in ord + +print(ord(b'a')) +print(ord(b'\x00')) +print(ord(b'\x01')) +print(ord(b'\x7f')) +print(ord(b'\x80')) +print(ord(b'\xff')) + +try: + ord(b'') +except TypeError: + print("TypeError")