py/runtime: If inplace binop fails then try corresponding normal binop.

The code that handles inplace-operator to normal-binary-operator fallback
is moved in this commit from py/objtype.c to py/runtime.c, making it apply
to all types, not just user classes.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George
2023-05-12 23:16:37 +10:00
parent 4b57330465
commit ea7031faff
5 changed files with 35 additions and 12 deletions

View File

@@ -625,6 +625,15 @@ generic_binary_op:
}
}
// If this was an inplace method, fallback to the corresponding normal method.
// https://docs.python.org/3/reference/datamodel.html#object.__iadd__ :
// "If a specific method is not defined, the augmented assignment falls back
// to the normal methods."
if (op >= MP_BINARY_OP_INPLACE_OR && op <= MP_BINARY_OP_INPLACE_POWER) {
op += MP_BINARY_OP_OR - MP_BINARY_OP_INPLACE_OR;
goto generic_binary_op;
}
#if MICROPY_PY_REVERSE_SPECIAL_METHODS
if (op >= MP_BINARY_OP_OR && op <= MP_BINARY_OP_POWER) {
mp_obj_t t = rhs;