diff options
author | Damien George <damien@micropython.org> | 2023-05-12 23:17:20 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2023-05-19 13:42:35 +1000 |
commit | 4b57330465b98df30ef8a10e19a0e197b5797550 (patch) | |
tree | b3a674e8cb6673ab451d6ef6d97ec29aed910a6b /py/objstr.c | |
parent | ca9068e0efc5e53ff7042ef68ad4a4ec9ff91915 (diff) | |
download | micropython-4b57330465b98df30ef8a10e19a0e197b5797550.tar.gz micropython-4b57330465b98df30ef8a10e19a0e197b5797550.zip |
py/objstr: Return unsupported binop instead of raising TypeError.
So that user types can implement reverse operators and have them work with
str on the left-hand-side, eg `"a" + UserType()`.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/objstr.c')
-rw-r--r-- | py/objstr.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/py/objstr.c b/py/objstr.c index 4d9dca04af..e6c5ee71cf 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -403,7 +403,16 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i } else { // LHS is str and RHS has an incompatible type // (except if operation is EQUAL, but that's handled by mp_obj_equal) - bad_implicit_conversion(rhs_in); + + // CONTAINS must fail with a bad-implicit-conversion exception, because + // otherwise mp_binary_op() will fallback to `list(lhs).__contains__(rhs)`. + if (op == MP_BINARY_OP_CONTAINS) { + bad_implicit_conversion(rhs_in); + } + + // All other operations are not supported, and may be handled by another + // type, eg for reverse operations. + return MP_OBJ_NULL; } switch (op) { |