From 707cae749424104660cd24e7c1f1e16d67b99b0f Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 22 Jul 2016 00:34:34 +0300 Subject: [PATCH] py/obj: Issue a warning when str and bytes objects are compared. Something like: if foo == "bar": will be always false if foo is b"bar". In CPython, warning is issued if interpreter is started as "python3 -b". In MicroPython, MICROPY_PY_STR_BYTES_CMP_WARN setting controls it. --- py/mpconfig.h | 5 +++++ py/obj.c | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/py/mpconfig.h b/py/mpconfig.h index 19e290c37e..2ba5f1acf2 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -590,6 +590,11 @@ typedef double mp_float_t; #define MICROPY_PY_ASYNC_AWAIT (1) #endif +// Support for async/await/async for/async with +#ifndef MICROPY_PY_STR_BYTES_CMP_WARN +#define MICROPY_PY_STR_BYTES_CMP_WARN (0) +#endif + // Whether str object is proper unicode #ifndef MICROPY_PY_BUILTINS_STR_UNICODE #define MICROPY_PY_BUILTINS_STR_UNICODE (0) diff --git a/py/obj.c b/py/obj.c index 9efa0f05ae..db4dd770fc 100644 --- a/py/obj.c +++ b/py/obj.c @@ -192,10 +192,16 @@ bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { return mp_obj_str_equal(o1, o2); } else { // a string is never equal to anything else - return false; + goto str_cmp_err; } } else if (MP_OBJ_IS_STR(o2)) { // o1 is not a string (else caught above), so the objects are not equal + str_cmp_err: + #if MICROPY_PY_STR_BYTES_CMP_WARN + if (MP_OBJ_IS_TYPE(o1, &mp_type_bytes) || MP_OBJ_IS_TYPE(o2, &mp_type_bytes)) { + mp_warning("BytesWarning: Comparison between bytes and str"); + } + #endif return false; }