[case testIsinstanceInt]
def is_int(value: object) -> bool:
    return isinstance(value, int)

[out]
def is_int(value):
    value, r0 :: object
    r1 :: int32
    r2 :: bit
    r3 :: bool
L0:
    r0 = load_address PyLong_Type
    r1 = PyObject_IsInstance(value, r0)
    r2 = r1 >= 0 :: signed
    r3 = truncate r1: int32 to builtins.bool
    return r3

[case testIsinstanceNotBool1]
def is_not_bool(value: object) -> bool:
    return not isinstance(value, bool)

[out]
def is_not_bool(value):
    value, r0 :: object
    r1 :: int32
    r2 :: bit
    r3, r4 :: bool
L0:
    r0 = load_address PyBool_Type
    r1 = PyObject_IsInstance(value, r0)
    r2 = r1 >= 0 :: signed
    r3 = truncate r1: int32 to builtins.bool
    r4 = r3 ^ 1
    return r4

[case testIsinstanceIntAndNotBool]
# This test is to ensure that 'value' doesn't get coerced to int when we are
# checking if it's a bool, since an int can never be an instance of a bool
def is_not_bool_and_is_int(value: object) -> bool:
    return isinstance(value, int) and not isinstance(value, bool)

[out]
def is_not_bool_and_is_int(value):
    value, r0 :: object
    r1 :: int32
    r2 :: bit
    r3, r4 :: bool
    r5 :: object
    r6 :: int32
    r7 :: bit
    r8, r9 :: bool
L0:
    r0 = load_address PyLong_Type
    r1 = PyObject_IsInstance(value, r0)
    r2 = r1 >= 0 :: signed
    r3 = truncate r1: int32 to builtins.bool
    if r3 goto L2 else goto L1 :: bool
L1:
    r4 = r3
    goto L3
L2:
    r5 = load_address PyBool_Type
    r6 = PyObject_IsInstance(value, r5)
    r7 = r6 >= 0 :: signed
    r8 = truncate r6: int32 to builtins.bool
    r9 = r8 ^ 1
    r4 = r9
L3:
    return r4
