| -- Generate ops related to Any types |
| |
| |
| [case testCoerceAnyInCallsAndReturn] |
| from typing import Any |
| def f(x: Any) -> Any: |
| return g(x) |
| def g(x: int) -> int: |
| return f(x) |
| [out] |
| def f(x): |
| x :: object |
| r0, r1 :: int |
| r2 :: object |
| L0: |
| r0 = unbox(int, x) |
| r1 = g(r0) |
| r2 = box(int, r1) |
| return r2 |
| def g(x): |
| x :: int |
| r0, r1 :: object |
| r2 :: int |
| L0: |
| r0 = box(int, x) |
| r1 = f(r0) |
| r2 = unbox(int, r1) |
| return r2 |
| |
| [case testCoerceAnyInAssignment] |
| from typing import Any, Tuple |
| class C: |
| a: Any |
| n: int |
| def f(a: Any, n: int, c: C) -> None: |
| c.a = n |
| c.n = a |
| a = n |
| n = a |
| a.a = n |
| [out] |
| def f(a, n, c): |
| a :: object |
| n :: int |
| c :: __main__.C |
| r0 :: object |
| r1 :: bool |
| r2 :: int |
| r3 :: bool |
| r4 :: object |
| r5 :: int |
| r6 :: str |
| r7 :: object |
| r8 :: bool |
| r9 :: None |
| L0: |
| r0 = box(int, n) |
| c.a = r0; r1 = is_error |
| r2 = unbox(int, a) |
| c.n = r2; r3 = is_error |
| r4 = box(int, n) |
| a = r4 |
| r5 = unbox(int, a) |
| n = r5 |
| r6 = unicode_6 :: static ('a') |
| r7 = box(int, n) |
| r8 = setattr a, r6, r7 |
| r9 = None |
| return r9 |
| |
| [case testCoerceAnyInOps] |
| from typing import Any, List |
| def f1(a: Any, n: int) -> None: |
| a + n |
| n + a |
| def f2(a: Any, n: int, l: List[int]) -> None: |
| a[n] |
| l[a] |
| a[n] = n |
| l[a] = n |
| l[n] = a |
| [a, n] |
| def f3(a: Any, n: int) -> None: |
| a += n |
| n += a |
| [out] |
| def f1(a, n): |
| a :: object |
| n :: int |
| r0, r1, r2, r3 :: object |
| r4 :: None |
| L0: |
| r0 = box(int, n) |
| r1 = a + r0 |
| r2 = box(int, n) |
| r3 = r2 + a |
| r4 = None |
| return r4 |
| def f2(a, n, l): |
| a :: object |
| n :: int |
| l :: list |
| r0, r1, r2, r3, r4 :: object |
| r5 :: bool |
| r6 :: object |
| r7, r8 :: bool |
| r9 :: object |
| r10 :: list |
| r11 :: None |
| L0: |
| r0 = box(int, n) |
| r1 = a[r0] :: object |
| r2 = l[a] :: object |
| r3 = box(int, n) |
| r4 = box(int, n) |
| r5 = a.__setitem__(r3, r4) :: object |
| r6 = box(int, n) |
| r7 = l.__setitem__(a, r6) :: object |
| r8 = l.__setitem__(n, a) :: list |
| r9 = box(int, n) |
| r10 = [a, r9] |
| r11 = None |
| return r11 |
| def f3(a, n): |
| a :: object |
| n :: int |
| r0, r1, r2, r3 :: object |
| r4 :: int |
| r5 :: None |
| L0: |
| r0 = box(int, n) |
| r1 = a += r0 |
| a = r1 |
| r2 = box(int, n) |
| r3 = r2 += a |
| r4 = unbox(int, r3) |
| n = r4 |
| r5 = None |
| return r5 |
| |
| [case testCoerceAnyInConditionalExpr] |
| from typing import Any |
| def f4(a: Any, n: int, b: bool) -> None: |
| a = a if b else n |
| n = n if b else a |
| [out] |
| def f4(a, n, b): |
| a :: object |
| n :: int |
| b :: bool |
| r0, r1, r2, r3 :: object |
| r4 :: int |
| r5 :: None |
| L0: |
| if b goto L1 else goto L2 :: bool |
| L1: |
| r0 = a |
| goto L3 |
| L2: |
| r1 = box(int, n) |
| r0 = r1 |
| L3: |
| a = r0 |
| if b goto L4 else goto L5 :: bool |
| L4: |
| r3 = box(int, n) |
| r2 = r3 |
| goto L6 |
| L5: |
| r2 = a |
| L6: |
| r4 = unbox(int, r2) |
| n = r4 |
| r5 = None |
| return r5 |