Skip to content
  • Damien George's avatar
    py/runtime: Add MP_BINARY_OP_CONTAINS as reverse of MP_BINARY_OP_IN. · 5e34a113
    Damien George authored
    Before this patch MP_BINARY_OP_IN had two meanings: coming from bytecode it
    meant that the args needed to be swapped, but coming from within the
    runtime meant that the args were already in the correct order.  This lead
    to some confusion in the code and comments stating how args were reversed.
    It also lead to 2 bugs: 1) containment for a subclass of a native type
    didn't work; 2) the expression "{True} in True" would illegally succeed and
    return True.  In both of these cases it was because the args to
    MP_BINARY_OP_IN ended up being reversed twice.
    
    To fix these things this patch introduces MP_BINARY_OP_CONTAINS which
    corresponds exactly to the __contains__ special method, and this is the
    operator that built-in types should implement.  MP_BINARY_OP_IN is now only
    emitted by the compiler and is converted to MP_BINARY_OP_CONTAINS by
    swapping the arguments.
    5e34a113