py/runtime: Fix bool unary op for subclasses of native types.

Previously a subclass of a type that didn't implement unary_op, or didn't
handle MP_UNARY_OP_BOOL, would raise TypeError on bool conversion.

Fixes #5677.
This commit is contained in:
Jim Mussared
2020-02-20 22:30:49 +11:00
committed by Damien George
parent 14b853eae0
commit 4e39ff221a
2 changed files with 13 additions and 0 deletions

View File

@@ -284,6 +284,12 @@ mp_obj_t mp_unary_op(mp_unary_op_t op, mp_obj_t arg) {
return result;
}
}
if (op == MP_UNARY_OP_BOOL) {
// Type doesn't have unary_op (or didn't handle MP_UNARY_OP_BOOL),
// so is implicitly True as this code path is impossible to reach
// if arg==mp_const_none.
return mp_const_true;
}
// With MP_UNARY_OP_INT, mp_unary_op() becomes a fallback for mp_obj_get_int().
// In this case provide a more focused error message to not confuse, e.g. chr(1.0)
#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE