| [case testIsinstanceInt] |
| def is_int(value: object) -> bool: |
| return isinstance(value, int) |
| |
| [out] |
| def is_int(value): |
| value, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = PyObject_IsInstance(value, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 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 :: i32 |
| r2 :: bit |
| r3, r4 :: bool |
| L0: |
| r0 = load_address PyBool_Type |
| r1 = PyObject_IsInstance(value, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 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 :: i32 |
| r2 :: bit |
| r3, r4 :: bool |
| r5 :: object |
| r6 :: i32 |
| r7 :: bit |
| r8, r9 :: bool |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = PyObject_IsInstance(value, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 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: i32 to builtins.bool |
| r9 = r8 ^ 1 |
| r4 = r9 |
| L3: |
| return r4 |
| |
| [case testBorrowSpecialCaseWithIsinstance] |
| class C: |
| s: str |
| |
| def g() -> object: |
| pass |
| |
| def f() -> None: |
| x = g() |
| if isinstance(x, C): |
| x.s |
| [out] |
| def g(): |
| r0 :: object |
| L0: |
| r0 = box(None, 1) |
| return r0 |
| def f(): |
| r0, x, r1 :: object |
| r2 :: ptr |
| r3 :: object |
| r4 :: bit |
| r5 :: __main__.C |
| r6 :: str |
| L0: |
| r0 = g() |
| x = r0 |
| r1 = __main__.C :: type |
| r2 = get_element_ptr x ob_type :: PyObject |
| r3 = load_mem r2 :: builtins.object* |
| keep_alive x |
| r4 = r3 == r1 |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| r5 = borrow cast(__main__.C, x) |
| r6 = r5.s |
| keep_alive x |
| L2: |
| return 1 |