irbuild-any.test 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. -- Generate ops related to Any types
  2. [case testCoerceAnyInCallsAndReturn]
  3. from typing import Any
  4. def f(x: Any) -> Any:
  5. return g(x)
  6. def g(x: int) -> int:
  7. return f(x)
  8. [out]
  9. def f(x):
  10. x :: object
  11. r0, r1 :: int
  12. r2 :: object
  13. L0:
  14. r0 = unbox(int, x)
  15. r1 = g(r0)
  16. r2 = box(int, r1)
  17. return r2
  18. def g(x):
  19. x :: int
  20. r0, r1 :: object
  21. r2 :: int
  22. L0:
  23. r0 = box(int, x)
  24. r1 = f(r0)
  25. r2 = unbox(int, r1)
  26. return r2
  27. [case testCoerceAnyInAssignment]
  28. from typing import Any, Tuple
  29. class C:
  30. a: Any
  31. n: int
  32. def f(a: Any, n: int, c: C) -> None:
  33. c.a = n
  34. c.n = a
  35. a = n
  36. n = a
  37. a.a = n
  38. [out]
  39. def f(a, n, c):
  40. a :: object
  41. n :: int
  42. c :: __main__.C
  43. r0 :: object
  44. r1 :: bool
  45. r2 :: int
  46. r3 :: bool
  47. r4 :: object
  48. r5 :: int
  49. r6 :: str
  50. r7 :: object
  51. r8 :: i32
  52. r9 :: bit
  53. L0:
  54. r0 = box(int, n)
  55. c.a = r0; r1 = is_error
  56. r2 = unbox(int, a)
  57. c.n = r2; r3 = is_error
  58. r4 = box(int, n)
  59. a = r4
  60. r5 = unbox(int, a)
  61. n = r5
  62. r6 = 'a'
  63. r7 = box(int, n)
  64. r8 = PyObject_SetAttr(a, r6, r7)
  65. r9 = r8 >= 0 :: signed
  66. return 1
  67. [case testCoerceAnyInOps]
  68. from typing import Any, List
  69. def f1(a: Any, n: int) -> None:
  70. a + n
  71. n + a
  72. def f2(a: Any, n: int, l: List[int]) -> None:
  73. a[n]
  74. l[a]
  75. a[n] = n
  76. l[a] = n
  77. l[n] = a
  78. [a, n]
  79. def f3(a: Any, n: int) -> None:
  80. a += n
  81. n += a
  82. [out]
  83. def f1(a, n):
  84. a :: object
  85. n :: int
  86. r0, r1, r2, r3 :: object
  87. L0:
  88. r0 = box(int, n)
  89. r1 = PyNumber_Add(a, r0)
  90. r2 = box(int, n)
  91. r3 = PyNumber_Add(r2, a)
  92. return 1
  93. def f2(a, n, l):
  94. a :: object
  95. n :: int
  96. l :: list
  97. r0, r1, r2, r3, r4 :: object
  98. r5 :: i32
  99. r6 :: bit
  100. r7 :: object
  101. r8 :: i32
  102. r9, r10 :: bit
  103. r11 :: list
  104. r12 :: object
  105. r13, r14, r15 :: ptr
  106. L0:
  107. r0 = box(int, n)
  108. r1 = PyObject_GetItem(a, r0)
  109. r2 = PyObject_GetItem(l, a)
  110. r3 = box(int, n)
  111. r4 = box(int, n)
  112. r5 = PyObject_SetItem(a, r3, r4)
  113. r6 = r5 >= 0 :: signed
  114. r7 = box(int, n)
  115. r8 = PyObject_SetItem(l, a, r7)
  116. r9 = r8 >= 0 :: signed
  117. r10 = CPyList_SetItem(l, n, a)
  118. r11 = PyList_New(2)
  119. r12 = box(int, n)
  120. r13 = get_element_ptr r11 ob_item :: PyListObject
  121. r14 = load_mem r13 :: ptr*
  122. set_mem r14, a :: builtins.object*
  123. r15 = r14 + WORD_SIZE*1
  124. set_mem r15, r12 :: builtins.object*
  125. keep_alive r11
  126. return 1
  127. def f3(a, n):
  128. a :: object
  129. n :: int
  130. r0, r1, r2, r3 :: object
  131. r4 :: int
  132. L0:
  133. r0 = box(int, n)
  134. r1 = PyNumber_InPlaceAdd(a, r0)
  135. a = r1
  136. r2 = box(int, n)
  137. r3 = PyNumber_InPlaceAdd(r2, a)
  138. r4 = unbox(int, r3)
  139. n = r4
  140. return 1
  141. [case testCoerceAnyInConditionalExpr]
  142. from typing import Any
  143. def f4(a: Any, n: int, b: bool) -> None:
  144. a = a if b else n
  145. n = n if b else a
  146. [out]
  147. def f4(a, n, b):
  148. a :: object
  149. n :: int
  150. b :: bool
  151. r0, r1, r2, r3 :: object
  152. r4 :: int
  153. L0:
  154. if b goto L1 else goto L2 :: bool
  155. L1:
  156. r0 = a
  157. goto L3
  158. L2:
  159. r1 = box(int, n)
  160. r0 = r1
  161. L3:
  162. a = r0
  163. if b goto L4 else goto L5 :: bool
  164. L4:
  165. r2 = box(int, n)
  166. r3 = r2
  167. goto L6
  168. L5:
  169. r3 = a
  170. L6:
  171. r4 = unbox(int, r3)
  172. n = r4
  173. return 1
  174. [case testAbsSpecialization]
  175. # Specialization of native classes that implement __abs__ is checked in
  176. # irbuild-dunders.test
  177. def f() -> None:
  178. a = abs(1)
  179. b = abs(1.1)
  180. [out]
  181. def f():
  182. r0, r1 :: object
  183. r2, a :: int
  184. r3, b :: float
  185. L0:
  186. r0 = object 1
  187. r1 = PyNumber_Absolute(r0)
  188. r2 = unbox(int, r1)
  189. a = r2
  190. r3 = fabs(1.1)
  191. b = r3
  192. return 1
  193. [case testFunctionBasedOps]
  194. def f() -> None:
  195. a = divmod(5, 2)
  196. def f2() -> int:
  197. return pow(2, 5)
  198. def f3() -> float:
  199. return pow(2, 5, 3)
  200. [out]
  201. def f():
  202. r0, r1, r2 :: object
  203. r3, a :: tuple[float, float]
  204. L0:
  205. r0 = object 5
  206. r1 = object 2
  207. r2 = PyNumber_Divmod(r0, r1)
  208. r3 = unbox(tuple[float, float], r2)
  209. a = r3
  210. return 1
  211. def f2():
  212. r0, r1, r2 :: object
  213. r3 :: int
  214. L0:
  215. r0 = object 2
  216. r1 = object 5
  217. r2 = CPyNumber_Power(r0, r1)
  218. r3 = unbox(int, r2)
  219. return r3
  220. def f3():
  221. r0, r1, r2, r3 :: object
  222. r4 :: int
  223. r5 :: float
  224. L0:
  225. r0 = object 2
  226. r1 = object 5
  227. r2 = object 3
  228. r3 = PyNumber_Power(r0, r1, r2)
  229. r4 = unbox(int, r3)
  230. r5 = CPyFloat_FromTagged(r4)
  231. return r5