• Damien George's avatar
    py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. · bdbe8c9a
    Damien George authored
    Fixes #1684 and makes "not" match Python semantics.  The code is also
    simplified (the separate MP_BC_NOT opcode is removed) and the patch saves
    68 bytes for bare-arm/ and 52 bytes for minimal/.
    Previously "not x" was implemented as !mp_unary_op(x, MP_UNARY_OP_BOOL),
    so any given object only needs to implement MP_UNARY_OP_BOOL (and the VM
    had a special opcode to do the ! bit).
    With this patch "not x" is implemented as mp_unary_op(x, MP_UNARY_OP_NOT),
    but this operation is caught at the start of mp_unary_op and dispatched as
    !mp_obj_is_true(x).  mp_obj_is_true has special logic to test for
    truthness, and is the correct way to handle the not operation.