| [case testMatchValuePattern_python3_10] |
| def f(): |
| match 123: |
| case 123: |
| print("matched") |
| [out] |
| def f(): |
| r0 :: bit |
| r1 :: str |
| r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: object[1] |
| r6 :: object_ptr |
| r7, r8 :: object |
| L0: |
| r0 = 246 == 246 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = 'matched' |
| r2 = builtins :: module |
| r3 = 'print' |
| r4 = CPyObject_GetAttr(r2, r3) |
| r5 = [r1] |
| r6 = load_address r5 |
| r7 = _PyObject_Vectorcall(r4, r6, 1, 0) |
| keep_alive r1 |
| goto L3 |
| L2: |
| L3: |
| r8 = box(None, 1) |
| return r8 |
| [case testMatchOrPattern_python3_10] |
| def f(): |
| match 123: |
| case 123 | 456: |
| print("matched") |
| [out] |
| def f(): |
| r0, r1 :: bit |
| r2 :: str |
| r3 :: object |
| r4 :: str |
| r5 :: object |
| r6 :: object[1] |
| r7 :: object_ptr |
| r8, r9 :: object |
| L0: |
| r0 = 246 == 246 |
| if r0 goto L3 else goto L1 :: bool |
| L1: |
| r1 = 246 == 912 |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| goto L4 |
| L3: |
| r2 = 'matched' |
| r3 = builtins :: module |
| r4 = 'print' |
| r5 = CPyObject_GetAttr(r3, r4) |
| r6 = [r2] |
| r7 = load_address r6 |
| r8 = _PyObject_Vectorcall(r5, r7, 1, 0) |
| keep_alive r2 |
| goto L5 |
| L4: |
| L5: |
| r9 = box(None, 1) |
| return r9 |
| [case testMatchOrPatternManyPatterns_python3_10] |
| def f(): |
| match 1: |
| case 1 | 2 | 3 | 4: |
| print("matched") |
| [out] |
| def f(): |
| r0, r1, r2, r3 :: bit |
| r4 :: str |
| r5 :: object |
| r6 :: str |
| r7 :: object |
| r8 :: object[1] |
| r9 :: object_ptr |
| r10, r11 :: object |
| L0: |
| r0 = 2 == 2 |
| if r0 goto L5 else goto L1 :: bool |
| L1: |
| r1 = 2 == 4 |
| if r1 goto L5 else goto L2 :: bool |
| L2: |
| r2 = 2 == 6 |
| if r2 goto L5 else goto L3 :: bool |
| L3: |
| r3 = 2 == 8 |
| if r3 goto L5 else goto L4 :: bool |
| L4: |
| goto L6 |
| L5: |
| r4 = 'matched' |
| r5 = builtins :: module |
| r6 = 'print' |
| r7 = CPyObject_GetAttr(r5, r6) |
| r8 = [r4] |
| r9 = load_address r8 |
| r10 = _PyObject_Vectorcall(r7, r9, 1, 0) |
| keep_alive r4 |
| goto L7 |
| L6: |
| L7: |
| r11 = box(None, 1) |
| return r11 |
| [case testMatchClassPattern_python3_10] |
| def f(): |
| match 123: |
| case int(): |
| print("matched") |
| [out] |
| def f(): |
| r0, r1 :: object |
| r2 :: bool |
| r3 :: str |
| r4 :: object |
| r5 :: str |
| r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10 :: object |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = object 123 |
| r2 = CPy_TypeCheck(r1, r0) |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| r3 = 'matched' |
| r4 = builtins :: module |
| r5 = 'print' |
| r6 = CPyObject_GetAttr(r4, r5) |
| r7 = [r3] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r6, r8, 1, 0) |
| keep_alive r3 |
| goto L3 |
| L2: |
| L3: |
| r10 = box(None, 1) |
| return r10 |
| [case testMatchExaustivePattern_python3_10] |
| def f(): |
| match 123: |
| case _: |
| print("matched") |
| [out] |
| def f(): |
| r0 :: str |
| r1 :: object |
| r2 :: str |
| r3 :: object |
| r4 :: object[1] |
| r5 :: object_ptr |
| r6, r7 :: object |
| L0: |
| L1: |
| r0 = 'matched' |
| r1 = builtins :: module |
| r2 = 'print' |
| r3 = CPyObject_GetAttr(r1, r2) |
| r4 = [r0] |
| r5 = load_address r4 |
| r6 = _PyObject_Vectorcall(r3, r5, 1, 0) |
| keep_alive r0 |
| goto L3 |
| L2: |
| L3: |
| r7 = box(None, 1) |
| return r7 |
| [case testMatchMultipleBodies_python3_10] |
| def f(): |
| match 123: |
| case 123: |
| print("matched") |
| case 456: |
| print("no match") |
| [out] |
| def f(): |
| r0 :: bit |
| r1 :: str |
| r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: object[1] |
| r6 :: object_ptr |
| r7 :: object |
| r8 :: bit |
| r9 :: str |
| r10 :: object |
| r11 :: str |
| r12 :: object |
| r13 :: object[1] |
| r14 :: object_ptr |
| r15, r16 :: object |
| L0: |
| r0 = 246 == 246 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = 'matched' |
| r2 = builtins :: module |
| r3 = 'print' |
| r4 = CPyObject_GetAttr(r2, r3) |
| r5 = [r1] |
| r6 = load_address r5 |
| r7 = _PyObject_Vectorcall(r4, r6, 1, 0) |
| keep_alive r1 |
| goto L5 |
| L2: |
| r8 = 246 == 912 |
| if r8 goto L3 else goto L4 :: bool |
| L3: |
| r9 = 'no match' |
| r10 = builtins :: module |
| r11 = 'print' |
| r12 = CPyObject_GetAttr(r10, r11) |
| r13 = [r9] |
| r14 = load_address r13 |
| r15 = _PyObject_Vectorcall(r12, r14, 1, 0) |
| keep_alive r9 |
| goto L5 |
| L4: |
| L5: |
| r16 = box(None, 1) |
| return r16 |
| [case testMatchMultiBodyAndComplexOr_python3_10] |
| def f(): |
| match 123: |
| case 1: |
| print("here 1") |
| case 2 | 3: |
| print("here 2 | 3") |
| case 123: |
| print("here 123") |
| [out] |
| def f(): |
| r0 :: bit |
| r1 :: str |
| r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: object[1] |
| r6 :: object_ptr |
| r7 :: object |
| r8, r9 :: bit |
| r10 :: str |
| r11 :: object |
| r12 :: str |
| r13 :: object |
| r14 :: object[1] |
| r15 :: object_ptr |
| r16 :: object |
| r17 :: bit |
| r18 :: str |
| r19 :: object |
| r20 :: str |
| r21 :: object |
| r22 :: object[1] |
| r23 :: object_ptr |
| r24, r25 :: object |
| L0: |
| r0 = 246 == 2 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = 'here 1' |
| r2 = builtins :: module |
| r3 = 'print' |
| r4 = CPyObject_GetAttr(r2, r3) |
| r5 = [r1] |
| r6 = load_address r5 |
| r7 = _PyObject_Vectorcall(r4, r6, 1, 0) |
| keep_alive r1 |
| goto L9 |
| L2: |
| r8 = 246 == 4 |
| if r8 goto L5 else goto L3 :: bool |
| L3: |
| r9 = 246 == 6 |
| if r9 goto L5 else goto L4 :: bool |
| L4: |
| goto L6 |
| L5: |
| r10 = 'here 2 | 3' |
| r11 = builtins :: module |
| r12 = 'print' |
| r13 = CPyObject_GetAttr(r11, r12) |
| r14 = [r10] |
| r15 = load_address r14 |
| r16 = _PyObject_Vectorcall(r13, r15, 1, 0) |
| keep_alive r10 |
| goto L9 |
| L6: |
| r17 = 246 == 246 |
| if r17 goto L7 else goto L8 :: bool |
| L7: |
| r18 = 'here 123' |
| r19 = builtins :: module |
| r20 = 'print' |
| r21 = CPyObject_GetAttr(r19, r20) |
| r22 = [r18] |
| r23 = load_address r22 |
| r24 = _PyObject_Vectorcall(r21, r23, 1, 0) |
| keep_alive r18 |
| goto L9 |
| L8: |
| L9: |
| r25 = box(None, 1) |
| return r25 |
| [case testMatchWithGuard_python3_10] |
| def f(): |
| match 123: |
| case 123 if True: |
| print("matched") |
| [out] |
| def f(): |
| r0 :: bit |
| r1 :: str |
| r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: object[1] |
| r6 :: object_ptr |
| r7, r8 :: object |
| L0: |
| r0 = 246 == 246 |
| if r0 goto L1 else goto L3 :: bool |
| L1: |
| if 1 goto L2 else goto L3 :: bool |
| L2: |
| r1 = 'matched' |
| r2 = builtins :: module |
| r3 = 'print' |
| r4 = CPyObject_GetAttr(r2, r3) |
| r5 = [r1] |
| r6 = load_address r5 |
| r7 = _PyObject_Vectorcall(r4, r6, 1, 0) |
| keep_alive r1 |
| goto L4 |
| L3: |
| L4: |
| r8 = box(None, 1) |
| return r8 |
| [case testMatchSingleton_python3_10] |
| def f(): |
| match 123: |
| case True: |
| print("value is True") |
| case False: |
| print("value is False") |
| case None: |
| print("value is None") |
| [out] |
| def f(): |
| r0, r1 :: object |
| r2 :: bit |
| r3 :: str |
| r4 :: object |
| r5 :: str |
| r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10, r11 :: object |
| r12 :: bit |
| r13 :: str |
| r14 :: object |
| r15 :: str |
| r16 :: object |
| r17 :: object[1] |
| r18 :: object_ptr |
| r19, r20, r21 :: object |
| r22 :: bit |
| r23 :: str |
| r24 :: object |
| r25 :: str |
| r26 :: object |
| r27 :: object[1] |
| r28 :: object_ptr |
| r29, r30 :: object |
| L0: |
| r0 = object 123 |
| r1 = box(bool, 1) |
| r2 = r0 == r1 |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| r3 = 'value is True' |
| r4 = builtins :: module |
| r5 = 'print' |
| r6 = CPyObject_GetAttr(r4, r5) |
| r7 = [r3] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r6, r8, 1, 0) |
| keep_alive r3 |
| goto L7 |
| L2: |
| r10 = object 123 |
| r11 = box(bool, 0) |
| r12 = r10 == r11 |
| if r12 goto L3 else goto L4 :: bool |
| L3: |
| r13 = 'value is False' |
| r14 = builtins :: module |
| r15 = 'print' |
| r16 = CPyObject_GetAttr(r14, r15) |
| r17 = [r13] |
| r18 = load_address r17 |
| r19 = _PyObject_Vectorcall(r16, r18, 1, 0) |
| keep_alive r13 |
| goto L7 |
| L4: |
| r20 = load_address _Py_NoneStruct |
| r21 = object 123 |
| r22 = r21 == r20 |
| if r22 goto L5 else goto L6 :: bool |
| L5: |
| r23 = 'value is None' |
| r24 = builtins :: module |
| r25 = 'print' |
| r26 = CPyObject_GetAttr(r24, r25) |
| r27 = [r23] |
| r28 = load_address r27 |
| r29 = _PyObject_Vectorcall(r26, r28, 1, 0) |
| keep_alive r23 |
| goto L7 |
| L6: |
| L7: |
| r30 = box(None, 1) |
| return r30 |
| [case testMatchRecursiveOrPattern_python3_10] |
| def f(): |
| match 1: |
| case 1 | int(): |
| print("matched") |
| [out] |
| def f(): |
| r0 :: bit |
| r1, r2 :: object |
| r3 :: bool |
| r4 :: str |
| r5 :: object |
| r6 :: str |
| r7 :: object |
| r8 :: object[1] |
| r9 :: object_ptr |
| r10, r11 :: object |
| L0: |
| r0 = 2 == 2 |
| if r0 goto L3 else goto L1 :: bool |
| L1: |
| r1 = load_address PyLong_Type |
| r2 = object 1 |
| r3 = CPy_TypeCheck(r2, r1) |
| if r3 goto L3 else goto L2 :: bool |
| L2: |
| goto L4 |
| L3: |
| r4 = 'matched' |
| r5 = builtins :: module |
| r6 = 'print' |
| r7 = CPyObject_GetAttr(r5, r6) |
| r8 = [r4] |
| r9 = load_address r8 |
| r10 = _PyObject_Vectorcall(r7, r9, 1, 0) |
| keep_alive r4 |
| goto L5 |
| L4: |
| L5: |
| r11 = box(None, 1) |
| return r11 |
| [case testMatchAsPattern_python3_10] |
| def f(): |
| match 123: |
| case 123 as x: |
| print(x) |
| [out] |
| def f(): |
| r0 :: bit |
| r1, x, r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: object[1] |
| r6 :: object_ptr |
| r7, r8 :: object |
| L0: |
| r0 = 246 == 246 |
| r1 = object 123 |
| x = r1 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r2 = builtins :: module |
| r3 = 'print' |
| r4 = CPyObject_GetAttr(r2, r3) |
| r5 = [x] |
| r6 = load_address r5 |
| r7 = _PyObject_Vectorcall(r4, r6, 1, 0) |
| keep_alive x |
| goto L3 |
| L2: |
| L3: |
| r8 = box(None, 1) |
| return r8 |
| [case testMatchAsPatternOnOrPattern_python3_10] |
| def f(): |
| match 1: |
| case (1 | 2) as x: |
| print(x) |
| [out] |
| def f(): |
| r0 :: bit |
| r1, x :: object |
| r2 :: bit |
| r3, r4 :: object |
| r5 :: str |
| r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10 :: object |
| L0: |
| r0 = 2 == 2 |
| r1 = object 1 |
| x = r1 |
| if r0 goto L3 else goto L1 :: bool |
| L1: |
| r2 = 2 == 4 |
| r3 = object 2 |
| x = r3 |
| if r2 goto L3 else goto L2 :: bool |
| L2: |
| goto L4 |
| L3: |
| r4 = builtins :: module |
| r5 = 'print' |
| r6 = CPyObject_GetAttr(r4, r5) |
| r7 = [x] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r6, r8, 1, 0) |
| keep_alive x |
| goto L5 |
| L4: |
| L5: |
| r10 = box(None, 1) |
| return r10 |
| [case testMatchAsPatternOnClassPattern_python3_10] |
| def f(): |
| match 123: |
| case int() as i: |
| print(i) |
| [out] |
| def f(): |
| r0, r1 :: object |
| r2 :: bool |
| i :: int |
| r3 :: object |
| r4 :: str |
| r5, r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10 :: object |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = object 123 |
| r2 = CPy_TypeCheck(r1, r0) |
| if r2 goto L1 else goto L3 :: bool |
| L1: |
| i = 246 |
| L2: |
| r3 = builtins :: module |
| r4 = 'print' |
| r5 = CPyObject_GetAttr(r3, r4) |
| r6 = box(int, i) |
| r7 = [r6] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r5, r8, 1, 0) |
| keep_alive r6 |
| goto L4 |
| L3: |
| L4: |
| r10 = box(None, 1) |
| return r10 |
| [case testMatchClassPatternWithPositionalArgs_python3_10] |
| class Position: |
| __match_args__ = ("x", "y", "z") |
| |
| x: int |
| y: int |
| z: int |
| |
| def f(x): |
| match x: |
| case Position(1, 2, 3): |
| print("matched") |
| [out] |
| def Position.__mypyc_defaults_setup(__mypyc_self__): |
| __mypyc_self__ :: __main__.Position |
| r0, r1, r2 :: str |
| r3 :: tuple[str, str, str] |
| L0: |
| r0 = 'x' |
| r1 = 'y' |
| r2 = 'z' |
| r3 = (r0, r1, r2) |
| __mypyc_self__.__match_args__ = r3 |
| return 1 |
| def f(x): |
| x, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: str |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11 :: str |
| r12, r13, r14 :: object |
| r15 :: i32 |
| r16 :: bit |
| r17 :: bool |
| r18 :: str |
| r19, r20, r21 :: object |
| r22 :: i32 |
| r23 :: bit |
| r24 :: bool |
| r25 :: str |
| r26 :: object |
| r27 :: str |
| r28 :: object |
| r29 :: object[1] |
| r30 :: object_ptr |
| r31, r32 :: object |
| L0: |
| r0 = __main__.Position :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L5 :: bool |
| L1: |
| r4 = 'x' |
| r5 = CPyObject_GetAttr(x, r4) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L2 else goto L5 :: bool |
| L2: |
| r11 = 'y' |
| r12 = CPyObject_GetAttr(x, r11) |
| r13 = object 2 |
| r14 = PyObject_RichCompare(r12, r13, 2) |
| r15 = PyObject_IsTrue(r14) |
| r16 = r15 >= 0 :: signed |
| r17 = truncate r15: i32 to builtins.bool |
| if r17 goto L3 else goto L5 :: bool |
| L3: |
| r18 = 'z' |
| r19 = CPyObject_GetAttr(x, r18) |
| r20 = object 3 |
| r21 = PyObject_RichCompare(r19, r20, 2) |
| r22 = PyObject_IsTrue(r21) |
| r23 = r22 >= 0 :: signed |
| r24 = truncate r22: i32 to builtins.bool |
| if r24 goto L4 else goto L5 :: bool |
| L4: |
| r25 = 'matched' |
| r26 = builtins :: module |
| r27 = 'print' |
| r28 = CPyObject_GetAttr(r26, r27) |
| r29 = [r25] |
| r30 = load_address r29 |
| r31 = _PyObject_Vectorcall(r28, r30, 1, 0) |
| keep_alive r25 |
| goto L6 |
| L5: |
| L6: |
| r32 = box(None, 1) |
| return r32 |
| [case testMatchClassPatternWithKeywordPatterns_python3_10] |
| class Position: |
| x: int |
| y: int |
| z: int |
| |
| def f(x): |
| match x: |
| case Position(z=1, y=2, x=3): |
| print("matched") |
| [out] |
| def f(x): |
| x, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: str |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11 :: str |
| r12, r13, r14 :: object |
| r15 :: i32 |
| r16 :: bit |
| r17 :: bool |
| r18 :: str |
| r19, r20, r21 :: object |
| r22 :: i32 |
| r23 :: bit |
| r24 :: bool |
| r25 :: str |
| r26 :: object |
| r27 :: str |
| r28 :: object |
| r29 :: object[1] |
| r30 :: object_ptr |
| r31, r32 :: object |
| L0: |
| r0 = __main__.Position :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L5 :: bool |
| L1: |
| r4 = 'z' |
| r5 = CPyObject_GetAttr(x, r4) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L2 else goto L5 :: bool |
| L2: |
| r11 = 'y' |
| r12 = CPyObject_GetAttr(x, r11) |
| r13 = object 2 |
| r14 = PyObject_RichCompare(r12, r13, 2) |
| r15 = PyObject_IsTrue(r14) |
| r16 = r15 >= 0 :: signed |
| r17 = truncate r15: i32 to builtins.bool |
| if r17 goto L3 else goto L5 :: bool |
| L3: |
| r18 = 'x' |
| r19 = CPyObject_GetAttr(x, r18) |
| r20 = object 3 |
| r21 = PyObject_RichCompare(r19, r20, 2) |
| r22 = PyObject_IsTrue(r21) |
| r23 = r22 >= 0 :: signed |
| r24 = truncate r22: i32 to builtins.bool |
| if r24 goto L4 else goto L5 :: bool |
| L4: |
| r25 = 'matched' |
| r26 = builtins :: module |
| r27 = 'print' |
| r28 = CPyObject_GetAttr(r26, r27) |
| r29 = [r25] |
| r30 = load_address r29 |
| r31 = _PyObject_Vectorcall(r28, r30, 1, 0) |
| keep_alive r25 |
| goto L6 |
| L5: |
| L6: |
| r32 = box(None, 1) |
| return r32 |
| [case testMatchClassPatternWithNestedPattern_python3_10] |
| class C: |
| num: int |
| |
| def f(x): |
| match x: |
| case C(num=1 | 2): |
| print("matched") |
| [out] |
| def f(x): |
| x, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: str |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11, r12 :: object |
| r13 :: i32 |
| r14 :: bit |
| r15 :: bool |
| r16 :: str |
| r17 :: object |
| r18 :: str |
| r19 :: object |
| r20 :: object[1] |
| r21 :: object_ptr |
| r22, r23 :: object |
| L0: |
| r0 = __main__.C :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L5 :: bool |
| L1: |
| r4 = 'num' |
| r5 = CPyObject_GetAttr(x, r4) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L4 else goto L2 :: bool |
| L2: |
| r11 = object 2 |
| r12 = PyObject_RichCompare(r5, r11, 2) |
| r13 = PyObject_IsTrue(r12) |
| r14 = r13 >= 0 :: signed |
| r15 = truncate r13: i32 to builtins.bool |
| if r15 goto L4 else goto L3 :: bool |
| L3: |
| goto L5 |
| L4: |
| r16 = 'matched' |
| r17 = builtins :: module |
| r18 = 'print' |
| r19 = CPyObject_GetAttr(r17, r18) |
| r20 = [r16] |
| r21 = load_address r20 |
| r22 = _PyObject_Vectorcall(r19, r21, 1, 0) |
| keep_alive r16 |
| goto L6 |
| L5: |
| L6: |
| r23 = box(None, 1) |
| return r23 |
| [case testAsPatternDoesntBleedIntoSubPatterns_python3_10] |
| class C: |
| __match_args__ = ("a", "b") |
| a: int |
| b: int |
| |
| def f(x): |
| match x: |
| case C(1, 2) as y: |
| print("matched") |
| [out] |
| def C.__mypyc_defaults_setup(__mypyc_self__): |
| __mypyc_self__ :: __main__.C |
| r0, r1 :: str |
| r2 :: tuple[str, str] |
| L0: |
| r0 = 'a' |
| r1 = 'b' |
| r2 = (r0, r1) |
| __mypyc_self__.__match_args__ = r2 |
| return 1 |
| def f(x): |
| x, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4, y :: __main__.C |
| r5 :: str |
| r6, r7, r8 :: object |
| r9 :: i32 |
| r10 :: bit |
| r11 :: bool |
| r12 :: str |
| r13, r14, r15 :: object |
| r16 :: i32 |
| r17 :: bit |
| r18 :: bool |
| r19 :: str |
| r20 :: object |
| r21 :: str |
| r22 :: object |
| r23 :: object[1] |
| r24 :: object_ptr |
| r25, r26 :: object |
| L0: |
| r0 = __main__.C :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L5 :: bool |
| L1: |
| r4 = cast(__main__.C, x) |
| y = r4 |
| L2: |
| r5 = 'a' |
| r6 = CPyObject_GetAttr(x, r5) |
| r7 = object 1 |
| r8 = PyObject_RichCompare(r6, r7, 2) |
| r9 = PyObject_IsTrue(r8) |
| r10 = r9 >= 0 :: signed |
| r11 = truncate r9: i32 to builtins.bool |
| if r11 goto L3 else goto L5 :: bool |
| L3: |
| r12 = 'b' |
| r13 = CPyObject_GetAttr(x, r12) |
| r14 = object 2 |
| r15 = PyObject_RichCompare(r13, r14, 2) |
| r16 = PyObject_IsTrue(r15) |
| r17 = r16 >= 0 :: signed |
| r18 = truncate r16: i32 to builtins.bool |
| if r18 goto L4 else goto L5 :: bool |
| L4: |
| r19 = 'matched' |
| r20 = builtins :: module |
| r21 = 'print' |
| r22 = CPyObject_GetAttr(r20, r21) |
| r23 = [r19] |
| r24 = load_address r23 |
| r25 = _PyObject_Vectorcall(r22, r24, 1, 0) |
| keep_alive r19 |
| goto L6 |
| L5: |
| L6: |
| r26 = box(None, 1) |
| return r26 |
| [case testMatchClassPatternPositionalCapture_python3_10] |
| class C: |
| __match_args__ = ("x",) |
| |
| x: int |
| |
| def f(x): |
| match x: |
| case C(num): |
| print("matched") |
| [out] |
| def C.__mypyc_defaults_setup(__mypyc_self__): |
| __mypyc_self__ :: __main__.C |
| r0 :: str |
| r1 :: tuple[str] |
| L0: |
| r0 = 'x' |
| r1 = (r0) |
| __mypyc_self__.__match_args__ = r1 |
| return 1 |
| def f(x): |
| x, r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: str |
| r5 :: object |
| r6, num :: int |
| r7 :: str |
| r8 :: object |
| r9 :: str |
| r10 :: object |
| r11 :: object[1] |
| r12 :: object_ptr |
| r13, r14 :: object |
| L0: |
| r0 = __main__.C :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L3 :: bool |
| L1: |
| r4 = 'x' |
| r5 = CPyObject_GetAttr(x, r4) |
| r6 = unbox(int, r5) |
| num = r6 |
| L2: |
| r7 = 'matched' |
| r8 = builtins :: module |
| r9 = 'print' |
| r10 = CPyObject_GetAttr(r8, r9) |
| r11 = [r7] |
| r12 = load_address r11 |
| r13 = _PyObject_Vectorcall(r10, r12, 1, 0) |
| keep_alive r7 |
| goto L4 |
| L3: |
| L4: |
| r14 = box(None, 1) |
| return r14 |
| [case testMatchMappingEmpty_python3_10] |
| def f(x): |
| match x: |
| case {}: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: str |
| r3 :: object |
| r4 :: str |
| r5 :: object |
| r6 :: object[1] |
| r7 :: object_ptr |
| r8, r9 :: object |
| L0: |
| r0 = CPyMapping_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = 'matched' |
| r3 = builtins :: module |
| r4 = 'print' |
| r5 = CPyObject_GetAttr(r3, r4) |
| r6 = [r2] |
| r7 = load_address r6 |
| r8 = _PyObject_Vectorcall(r5, r7, 1, 0) |
| keep_alive r2 |
| goto L3 |
| L2: |
| L3: |
| r9 = box(None, 1) |
| return r9 |
| [case testMatchMappingPatternWithKeys_python3_10] |
| def f(x): |
| match x: |
| case {"key": "value"}: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: str |
| r3 :: i32 |
| r4 :: bit |
| r5 :: object |
| r6 :: str |
| r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11 :: str |
| r12 :: object |
| r13 :: str |
| r14 :: object |
| r15 :: object[1] |
| r16 :: object_ptr |
| r17, r18 :: object |
| L0: |
| r0 = CPyMapping_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L4 :: bool |
| L1: |
| r2 = 'key' |
| r3 = PyMapping_HasKey(x, r2) |
| r4 = r3 != 0 |
| if r4 goto L2 else goto L4 :: bool |
| L2: |
| r5 = PyObject_GetItem(x, r2) |
| r6 = 'value' |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L4 :: bool |
| L3: |
| r11 = 'matched' |
| r12 = builtins :: module |
| r13 = 'print' |
| r14 = CPyObject_GetAttr(r12, r13) |
| r15 = [r11] |
| r16 = load_address r15 |
| r17 = _PyObject_Vectorcall(r14, r16, 1, 0) |
| keep_alive r11 |
| goto L5 |
| L4: |
| L5: |
| r18 = box(None, 1) |
| return r18 |
| [case testMatchMappingPatternWithRest_python3_10] |
| def f(x): |
| match x: |
| case {**rest}: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2, rest :: dict |
| r3 :: str |
| r4 :: object |
| r5 :: str |
| r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10 :: object |
| L0: |
| r0 = CPyMapping_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L3 :: bool |
| L1: |
| r2 = CPyDict_FromAny(x) |
| rest = r2 |
| L2: |
| r3 = 'matched' |
| r4 = builtins :: module |
| r5 = 'print' |
| r6 = CPyObject_GetAttr(r4, r5) |
| r7 = [r3] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r6, r8, 1, 0) |
| keep_alive r3 |
| goto L4 |
| L3: |
| L4: |
| r10 = box(None, 1) |
| return r10 |
| [case testMatchMappingPatternWithRestPopKeys_python3_10] |
| def f(x): |
| match x: |
| case {"key": "value", **rest}: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: str |
| r3 :: i32 |
| r4 :: bit |
| r5 :: object |
| r6 :: str |
| r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11, rest :: dict |
| r12 :: i32 |
| r13 :: bit |
| r14 :: str |
| r15 :: object |
| r16 :: str |
| r17 :: object |
| r18 :: object[1] |
| r19 :: object_ptr |
| r20, r21 :: object |
| L0: |
| r0 = CPyMapping_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L5 :: bool |
| L1: |
| r2 = 'key' |
| r3 = PyMapping_HasKey(x, r2) |
| r4 = r3 != 0 |
| if r4 goto L2 else goto L5 :: bool |
| L2: |
| r5 = PyObject_GetItem(x, r2) |
| r6 = 'value' |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L5 :: bool |
| L3: |
| r11 = CPyDict_FromAny(x) |
| rest = r11 |
| r12 = PyDict_DelItem(r11, r2) |
| r13 = r12 >= 0 :: signed |
| L4: |
| r14 = 'matched' |
| r15 = builtins :: module |
| r16 = 'print' |
| r17 = CPyObject_GetAttr(r15, r16) |
| r18 = [r14] |
| r19 = load_address r18 |
| r20 = _PyObject_Vectorcall(r17, r19, 1, 0) |
| keep_alive r14 |
| goto L6 |
| L5: |
| L6: |
| r21 = box(None, 1) |
| return r21 |
| [case testMatchEmptySequencePattern_python3_10] |
| def f(x): |
| match x: |
| case []: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5 :: str |
| r6 :: object |
| r7 :: str |
| r8 :: object |
| r9 :: object[1] |
| r10 :: object_ptr |
| r11, r12 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L3 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 == 0 |
| if r4 goto L2 else goto L3 :: bool |
| L2: |
| r5 = 'matched' |
| r6 = builtins :: module |
| r7 = 'print' |
| r8 = CPyObject_GetAttr(r6, r7) |
| r9 = [r5] |
| r10 = load_address r9 |
| r11 = _PyObject_Vectorcall(r8, r10, 1, 0) |
| keep_alive r5 |
| goto L4 |
| L3: |
| L4: |
| r12 = box(None, 1) |
| return r12 |
| [case testMatchFixedLengthSequencePattern_python3_10] |
| def f(x): |
| match x: |
| case [1, 2]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11, r12, r13 :: object |
| r14 :: i32 |
| r15 :: bit |
| r16 :: bool |
| r17 :: str |
| r18 :: object |
| r19 :: str |
| r20 :: object |
| r21 :: object[1] |
| r22 :: object_ptr |
| r23, r24 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L5 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 == 2 |
| if r4 goto L2 else goto L5 :: bool |
| L2: |
| r5 = PySequence_GetItem(x, 0) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L5 :: bool |
| L3: |
| r11 = PySequence_GetItem(x, 1) |
| r12 = object 2 |
| r13 = PyObject_RichCompare(r11, r12, 2) |
| r14 = PyObject_IsTrue(r13) |
| r15 = r14 >= 0 :: signed |
| r16 = truncate r14: i32 to builtins.bool |
| if r16 goto L4 else goto L5 :: bool |
| L4: |
| r17 = 'matched' |
| r18 = builtins :: module |
| r19 = 'print' |
| r20 = CPyObject_GetAttr(r18, r19) |
| r21 = [r17] |
| r22 = load_address r21 |
| r23 = _PyObject_Vectorcall(r20, r22, 1, 0) |
| keep_alive r17 |
| goto L6 |
| L5: |
| L6: |
| r24 = box(None, 1) |
| return r24 |
| [case testMatchSequencePatternWithTrailingUnboundStar_python3_10] |
| def f(x): |
| match x: |
| case [1, 2, *_]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11, r12, r13 :: object |
| r14 :: i32 |
| r15 :: bit |
| r16 :: bool |
| r17 :: str |
| r18 :: object |
| r19 :: str |
| r20 :: object |
| r21 :: object[1] |
| r22 :: object_ptr |
| r23, r24 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L5 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 >= 2 :: signed |
| if r4 goto L2 else goto L5 :: bool |
| L2: |
| r5 = PySequence_GetItem(x, 0) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L5 :: bool |
| L3: |
| r11 = PySequence_GetItem(x, 1) |
| r12 = object 2 |
| r13 = PyObject_RichCompare(r11, r12, 2) |
| r14 = PyObject_IsTrue(r13) |
| r15 = r14 >= 0 :: signed |
| r16 = truncate r14: i32 to builtins.bool |
| if r16 goto L4 else goto L5 :: bool |
| L4: |
| r17 = 'matched' |
| r18 = builtins :: module |
| r19 = 'print' |
| r20 = CPyObject_GetAttr(r18, r19) |
| r21 = [r17] |
| r22 = load_address r21 |
| r23 = _PyObject_Vectorcall(r20, r22, 1, 0) |
| keep_alive r17 |
| goto L6 |
| L5: |
| L6: |
| r24 = box(None, 1) |
| return r24 |
| [case testMatchSequencePatternWithTrailingBoundStar_python3_10] |
| def f(x): |
| match x: |
| case [1, 2, *rest]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5, r6, r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11, r12, r13 :: object |
| r14 :: i32 |
| r15 :: bit |
| r16 :: bool |
| r17 :: native_int |
| r18, rest :: object |
| r19 :: str |
| r20 :: object |
| r21 :: str |
| r22 :: object |
| r23 :: object[1] |
| r24 :: object_ptr |
| r25, r26 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L6 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 >= 2 :: signed |
| if r4 goto L2 else goto L6 :: bool |
| L2: |
| r5 = PySequence_GetItem(x, 0) |
| r6 = object 1 |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L6 :: bool |
| L3: |
| r11 = PySequence_GetItem(x, 1) |
| r12 = object 2 |
| r13 = PyObject_RichCompare(r11, r12, 2) |
| r14 = PyObject_IsTrue(r13) |
| r15 = r14 >= 0 :: signed |
| r16 = truncate r14: i32 to builtins.bool |
| if r16 goto L4 else goto L6 :: bool |
| L4: |
| r17 = r2 - 0 |
| r18 = PySequence_GetSlice(x, 2, r17) |
| rest = r18 |
| L5: |
| r19 = 'matched' |
| r20 = builtins :: module |
| r21 = 'print' |
| r22 = CPyObject_GetAttr(r20, r21) |
| r23 = [r19] |
| r24 = load_address r23 |
| r25 = _PyObject_Vectorcall(r22, r24, 1, 0) |
| keep_alive r19 |
| goto L7 |
| L6: |
| L7: |
| r26 = box(None, 1) |
| return r26 |
| [case testMatchSequenceWithStarPatternInTheMiddle_python3_10] |
| def f(x): |
| match x: |
| case ["start", *rest, "end"]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5 :: object |
| r6 :: str |
| r7 :: object |
| r8 :: i32 |
| r9 :: bit |
| r10 :: bool |
| r11 :: native_int |
| r12 :: object |
| r13 :: str |
| r14 :: object |
| r15 :: i32 |
| r16 :: bit |
| r17 :: bool |
| r18 :: native_int |
| r19, rest :: object |
| r20 :: str |
| r21 :: object |
| r22 :: str |
| r23 :: object |
| r24 :: object[1] |
| r25 :: object_ptr |
| r26, r27 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L6 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 >= 2 :: signed |
| if r4 goto L2 else goto L6 :: bool |
| L2: |
| r5 = PySequence_GetItem(x, 0) |
| r6 = 'start' |
| r7 = PyObject_RichCompare(r5, r6, 2) |
| r8 = PyObject_IsTrue(r7) |
| r9 = r8 >= 0 :: signed |
| r10 = truncate r8: i32 to builtins.bool |
| if r10 goto L3 else goto L6 :: bool |
| L3: |
| r11 = r2 - 1 |
| r12 = PySequence_GetItem(x, r11) |
| r13 = 'end' |
| r14 = PyObject_RichCompare(r12, r13, 2) |
| r15 = PyObject_IsTrue(r14) |
| r16 = r15 >= 0 :: signed |
| r17 = truncate r15: i32 to builtins.bool |
| if r17 goto L4 else goto L6 :: bool |
| L4: |
| r18 = r2 - 1 |
| r19 = PySequence_GetSlice(x, 1, r18) |
| rest = r19 |
| L5: |
| r20 = 'matched' |
| r21 = builtins :: module |
| r22 = 'print' |
| r23 = CPyObject_GetAttr(r21, r22) |
| r24 = [r20] |
| r25 = load_address r24 |
| r26 = _PyObject_Vectorcall(r23, r25, 1, 0) |
| keep_alive r20 |
| goto L7 |
| L6: |
| L7: |
| r27 = box(None, 1) |
| return r27 |
| [case testMatchSequenceWithStarPatternAtTheStart_python3_10] |
| def f(x): |
| match x: |
| case [*rest, 1, 2]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5 :: native_int |
| r6, r7, r8 :: object |
| r9 :: i32 |
| r10 :: bit |
| r11 :: bool |
| r12 :: native_int |
| r13, r14, r15 :: object |
| r16 :: i32 |
| r17 :: bit |
| r18 :: bool |
| r19 :: native_int |
| r20, rest :: object |
| r21 :: str |
| r22 :: object |
| r23 :: str |
| r24 :: object |
| r25 :: object[1] |
| r26 :: object_ptr |
| r27, r28 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L6 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 >= 2 :: signed |
| if r4 goto L2 else goto L6 :: bool |
| L2: |
| r5 = r2 - 2 |
| r6 = PySequence_GetItem(x, r5) |
| r7 = object 1 |
| r8 = PyObject_RichCompare(r6, r7, 2) |
| r9 = PyObject_IsTrue(r8) |
| r10 = r9 >= 0 :: signed |
| r11 = truncate r9: i32 to builtins.bool |
| if r11 goto L3 else goto L6 :: bool |
| L3: |
| r12 = r2 - 1 |
| r13 = PySequence_GetItem(x, r12) |
| r14 = object 2 |
| r15 = PyObject_RichCompare(r13, r14, 2) |
| r16 = PyObject_IsTrue(r15) |
| r17 = r16 >= 0 :: signed |
| r18 = truncate r16: i32 to builtins.bool |
| if r18 goto L4 else goto L6 :: bool |
| L4: |
| r19 = r2 - 2 |
| r20 = PySequence_GetSlice(x, 0, r19) |
| rest = r20 |
| L5: |
| r21 = 'matched' |
| r22 = builtins :: module |
| r23 = 'print' |
| r24 = CPyObject_GetAttr(r22, r23) |
| r25 = [r21] |
| r26 = load_address r25 |
| r27 = _PyObject_Vectorcall(r24, r26, 1, 0) |
| keep_alive r21 |
| goto L7 |
| L6: |
| L7: |
| r28 = box(None, 1) |
| return r28 |
| [case testMatchBuiltinClassPattern_python3_10] |
| def f(x): |
| match x: |
| case int(y): |
| print("matched") |
| [out] |
| def f(x): |
| x, r0 :: object |
| r1 :: bool |
| r2, y :: int |
| r3 :: str |
| r4 :: object |
| r5 :: str |
| r6 :: object |
| r7 :: object[1] |
| r8 :: object_ptr |
| r9, r10 :: object |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = CPy_TypeCheck(x, r0) |
| if r1 goto L1 else goto L3 :: bool |
| L1: |
| r2 = unbox(int, x) |
| y = r2 |
| L2: |
| r3 = 'matched' |
| r4 = builtins :: module |
| r5 = 'print' |
| r6 = CPyObject_GetAttr(r4, r5) |
| r7 = [r3] |
| r8 = load_address r7 |
| r9 = _PyObject_Vectorcall(r6, r8, 1, 0) |
| keep_alive r3 |
| goto L4 |
| L3: |
| L4: |
| r10 = box(None, 1) |
| return r10 |
| [case testMatchSequenceCaptureAll_python3_10] |
| def f(x): |
| match x: |
| case [*rest]: |
| print("matched") |
| [out] |
| def f(x): |
| x :: object |
| r0 :: i32 |
| r1 :: bit |
| r2 :: native_int |
| r3, r4 :: bit |
| r5 :: native_int |
| r6, rest :: object |
| r7 :: str |
| r8 :: object |
| r9 :: str |
| r10 :: object |
| r11 :: object[1] |
| r12 :: object_ptr |
| r13, r14 :: object |
| L0: |
| r0 = CPySequence_Check(x) |
| r1 = r0 != 0 |
| if r1 goto L1 else goto L4 :: bool |
| L1: |
| r2 = PyObject_Size(x) |
| r3 = r2 >= 0 :: signed |
| r4 = r2 >= 0 :: signed |
| if r4 goto L2 else goto L4 :: bool |
| L2: |
| r5 = r2 - 0 |
| r6 = PySequence_GetSlice(x, 0, r5) |
| rest = r6 |
| L3: |
| r7 = 'matched' |
| r8 = builtins :: module |
| r9 = 'print' |
| r10 = CPyObject_GetAttr(r8, r9) |
| r11 = [r7] |
| r12 = load_address r11 |
| r13 = _PyObject_Vectorcall(r10, r12, 1, 0) |
| keep_alive r7 |
| goto L5 |
| L4: |
| L5: |
| r14 = box(None, 1) |
| return r14 |
| [case testMatchTypeAnnotatedNativeClass_python3_10] |
| class A: |
| a: int |
| |
| def f(x: A | int) -> int: |
| match x: |
| case A(a=a): |
| return a |
| case int(): |
| return x |
| [out] |
| def f(x): |
| x :: union[__main__.A, int] |
| r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: str |
| r5 :: object |
| r6, a :: int |
| r7 :: object |
| r8 :: bool |
| r9 :: int |
| L0: |
| r0 = __main__.A :: type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L3 :: bool |
| L1: |
| r4 = 'a' |
| r5 = CPyObject_GetAttr(x, r4) |
| r6 = unbox(int, r5) |
| a = r6 |
| L2: |
| return a |
| L3: |
| r7 = load_address PyLong_Type |
| r8 = CPy_TypeCheck(x, r7) |
| if r8 goto L4 else goto L5 :: bool |
| L4: |
| r9 = unbox(int, x) |
| return r9 |
| L5: |
| L6: |
| unreachable |