| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- -- 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 :: i32
- r9 :: bit
- 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 = 'a'
- r7 = box(int, n)
- r8 = PyObject_SetAttr(a, r6, r7)
- r9 = r8 >= 0 :: signed
- return 1
- [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
- L0:
- r0 = box(int, n)
- r1 = PyNumber_Add(a, r0)
- r2 = box(int, n)
- r3 = PyNumber_Add(r2, a)
- return 1
- def f2(a, n, l):
- a :: object
- n :: int
- l :: list
- r0, r1, r2, r3, r4 :: object
- r5 :: i32
- r6 :: bit
- r7 :: object
- r8 :: i32
- r9, r10 :: bit
- r11 :: list
- r12 :: object
- r13, r14, r15 :: ptr
- L0:
- r0 = box(int, n)
- r1 = PyObject_GetItem(a, r0)
- r2 = PyObject_GetItem(l, a)
- r3 = box(int, n)
- r4 = box(int, n)
- r5 = PyObject_SetItem(a, r3, r4)
- r6 = r5 >= 0 :: signed
- r7 = box(int, n)
- r8 = PyObject_SetItem(l, a, r7)
- r9 = r8 >= 0 :: signed
- r10 = CPyList_SetItem(l, n, a)
- r11 = PyList_New(2)
- r12 = box(int, n)
- r13 = get_element_ptr r11 ob_item :: PyListObject
- r14 = load_mem r13 :: ptr*
- set_mem r14, a :: builtins.object*
- r15 = r14 + WORD_SIZE*1
- set_mem r15, r12 :: builtins.object*
- keep_alive r11
- return 1
- def f3(a, n):
- a :: object
- n :: int
- r0, r1, r2, r3 :: object
- r4 :: int
- L0:
- r0 = box(int, n)
- r1 = PyNumber_InPlaceAdd(a, r0)
- a = r1
- r2 = box(int, n)
- r3 = PyNumber_InPlaceAdd(r2, a)
- r4 = unbox(int, r3)
- n = r4
- return 1
- [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
- 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:
- r2 = box(int, n)
- r3 = r2
- goto L6
- L5:
- r3 = a
- L6:
- r4 = unbox(int, r3)
- n = r4
- return 1
- [case testAbsSpecialization]
- # Specialization of native classes that implement __abs__ is checked in
- # irbuild-dunders.test
- def f() -> None:
- a = abs(1)
- b = abs(1.1)
- [out]
- def f():
- r0, r1 :: object
- r2, a :: int
- r3, b :: float
- L0:
- r0 = object 1
- r1 = PyNumber_Absolute(r0)
- r2 = unbox(int, r1)
- a = r2
- r3 = fabs(1.1)
- b = r3
- return 1
- [case testFunctionBasedOps]
- def f() -> None:
- a = divmod(5, 2)
- def f2() -> int:
- return pow(2, 5)
- def f3() -> float:
- return pow(2, 5, 3)
- [out]
- def f():
- r0, r1, r2 :: object
- r3, a :: tuple[float, float]
- L0:
- r0 = object 5
- r1 = object 2
- r2 = PyNumber_Divmod(r0, r1)
- r3 = unbox(tuple[float, float], r2)
- a = r3
- return 1
- def f2():
- r0, r1, r2 :: object
- r3 :: int
- L0:
- r0 = object 2
- r1 = object 5
- r2 = CPyNumber_Power(r0, r1)
- r3 = unbox(int, r2)
- return r3
- def f3():
- r0, r1, r2, r3 :: object
- r4 :: int
- r5 :: float
- L0:
- r0 = object 2
- r1 = object 5
- r2 = object 3
- r3 = PyNumber_Power(r0, r1, r2)
- r4 = unbox(int, r3)
- r5 = CPyFloat_FromTagged(r4)
- return r5
|