irbuild-tuple.test 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. [case testTupleGet]
  2. from typing import Tuple
  3. def f(x: Tuple[Tuple[int, bool], bool]) -> int:
  4. return x[0][0]
  5. [out]
  6. def f(x):
  7. x :: tuple[tuple[int, bool], bool]
  8. r0 :: tuple[int, bool]
  9. r1 :: int
  10. L0:
  11. r0 = x[0]
  12. r1 = r0[0]
  13. return r1
  14. [case testTupleNew]
  15. from typing import Tuple
  16. def f() -> int:
  17. t = (True, 1)
  18. return t[1]
  19. [out]
  20. def f():
  21. r0, t :: tuple[bool, int]
  22. r1 :: int
  23. L0:
  24. r0 = (1, 2)
  25. t = r0
  26. r1 = t[1]
  27. return r1
  28. [case testTupleLen]
  29. from typing import Tuple
  30. def f(x: Tuple[bool, bool, int]) -> int:
  31. return len(x)
  32. [out]
  33. def f(x):
  34. x :: tuple[bool, bool, int]
  35. L0:
  36. return 6
  37. [case testSequenceTuple]
  38. from typing import List
  39. def f(x: List[bool]) -> bool:
  40. return tuple(x)[1]
  41. [out]
  42. def f(x):
  43. x :: list
  44. r0 :: tuple
  45. r1 :: object
  46. r2 :: bool
  47. L0:
  48. r0 = PyList_AsTuple(x)
  49. r1 = CPySequenceTuple_GetItem(r0, 2)
  50. r2 = unbox(bool, r1)
  51. return r2
  52. [case testSequenceTupleLen]
  53. from typing import Tuple
  54. def f(x: Tuple[int, ...]) -> int:
  55. return len(x)
  56. [out]
  57. def f(x):
  58. x :: tuple
  59. r0 :: ptr
  60. r1 :: native_int
  61. r2 :: short_int
  62. L0:
  63. r0 = get_element_ptr x ob_size :: PyVarObject
  64. r1 = load_mem r0 :: native_int*
  65. keep_alive x
  66. r2 = r1 << 1
  67. return r2
  68. [case testSequenceTupleForced]
  69. from typing import Tuple
  70. def f() -> int:
  71. t = (1, 2) # type: Tuple[int, ...]
  72. return t[1]
  73. [out]
  74. def f():
  75. r0 :: tuple[int, int]
  76. r1 :: object
  77. t :: tuple
  78. r2 :: object
  79. r3 :: int
  80. L0:
  81. r0 = (2, 4)
  82. r1 = box(tuple[int, int], r0)
  83. t = r1
  84. r2 = CPySequenceTuple_GetItem(t, 2)
  85. r3 = unbox(int, r2)
  86. return r3
  87. [case testTupleDisplay]
  88. from typing import Sequence, Tuple
  89. def f(x: Sequence[int], y: Sequence[int]) -> Tuple[int, ...]:
  90. return (1, 2, *x, *y, 3)
  91. [out]
  92. def f(x, y):
  93. x, y :: object
  94. r0 :: list
  95. r1, r2 :: object
  96. r3, r4, r5 :: ptr
  97. r6, r7, r8 :: object
  98. r9 :: int32
  99. r10 :: bit
  100. r11 :: tuple
  101. L0:
  102. r0 = PyList_New(2)
  103. r1 = object 1
  104. r2 = object 2
  105. r3 = get_element_ptr r0 ob_item :: PyListObject
  106. r4 = load_mem r3 :: ptr*
  107. set_mem r4, r1 :: builtins.object*
  108. r5 = r4 + WORD_SIZE*1
  109. set_mem r5, r2 :: builtins.object*
  110. keep_alive r0
  111. r6 = CPyList_Extend(r0, x)
  112. r7 = CPyList_Extend(r0, y)
  113. r8 = object 3
  114. r9 = PyList_Append(r0, r8)
  115. r10 = r9 >= 0 :: signed
  116. r11 = PyList_AsTuple(r0)
  117. return r11
  118. [case testTupleFor]
  119. from typing import Tuple, List
  120. def f(xs: Tuple[str, ...]) -> None:
  121. for x in xs:
  122. pass
  123. [out]
  124. def f(xs):
  125. xs :: tuple
  126. r0 :: short_int
  127. r1 :: ptr
  128. r2 :: native_int
  129. r3 :: short_int
  130. r4 :: bit
  131. r5 :: object
  132. r6, x :: str
  133. r7 :: short_int
  134. L0:
  135. r0 = 0
  136. L1:
  137. r1 = get_element_ptr xs ob_size :: PyVarObject
  138. r2 = load_mem r1 :: native_int*
  139. keep_alive xs
  140. r3 = r2 << 1
  141. r4 = r0 < r3 :: signed
  142. if r4 goto L2 else goto L4 :: bool
  143. L2:
  144. r5 = CPySequenceTuple_GetItem(xs, r0)
  145. r6 = cast(str, r5)
  146. x = r6
  147. L3:
  148. r7 = r0 + 2
  149. r0 = r7
  150. goto L1
  151. L4:
  152. return 1
  153. [case testNamedTupleAttribute]
  154. from typing import NamedTuple
  155. NT = NamedTuple('NT', [('x', int), ('y', int)])
  156. def f(nt: NT, b: bool) -> int:
  157. if b:
  158. return nt.x
  159. return nt.y
  160. [out]
  161. def f(nt, b):
  162. nt :: tuple
  163. b :: bool
  164. r0 :: object
  165. r1 :: int
  166. r2 :: object
  167. r3 :: int
  168. L0:
  169. if b goto L1 else goto L2 :: bool
  170. L1:
  171. r0 = CPySequenceTuple_GetItem(nt, 0)
  172. r1 = unbox(int, r0)
  173. return r1
  174. L2:
  175. r2 = CPySequenceTuple_GetItem(nt, 2)
  176. r3 = unbox(int, r2)
  177. return r3
  178. [case testTupleOperatorIn]
  179. def f(i: int) -> bool:
  180. return i in [1, 2, 3]
  181. [out]
  182. def f(i):
  183. i :: int
  184. r0 :: native_int
  185. r1, r2 :: bit
  186. r3 :: bool
  187. r4 :: bit
  188. r5 :: bool
  189. r6 :: native_int
  190. r7, r8 :: bit
  191. r9 :: bool
  192. r10 :: bit
  193. r11 :: bool
  194. r12 :: native_int
  195. r13, r14 :: bit
  196. r15 :: bool
  197. r16 :: bit
  198. L0:
  199. r0 = i & 1
  200. r1 = r0 == 0
  201. if r1 goto L1 else goto L2 :: bool
  202. L1:
  203. r2 = i == 2
  204. r3 = r2
  205. goto L3
  206. L2:
  207. r4 = CPyTagged_IsEq_(i, 2)
  208. r3 = r4
  209. L3:
  210. if r3 goto L4 else goto L5 :: bool
  211. L4:
  212. r5 = r3
  213. goto L9
  214. L5:
  215. r6 = i & 1
  216. r7 = r6 == 0
  217. if r7 goto L6 else goto L7 :: bool
  218. L6:
  219. r8 = i == 4
  220. r9 = r8
  221. goto L8
  222. L7:
  223. r10 = CPyTagged_IsEq_(i, 4)
  224. r9 = r10
  225. L8:
  226. r5 = r9
  227. L9:
  228. if r5 goto L10 else goto L11 :: bool
  229. L10:
  230. r11 = r5
  231. goto L15
  232. L11:
  233. r12 = i & 1
  234. r13 = r12 == 0
  235. if r13 goto L12 else goto L13 :: bool
  236. L12:
  237. r14 = i == 6
  238. r15 = r14
  239. goto L14
  240. L13:
  241. r16 = CPyTagged_IsEq_(i, 6)
  242. r15 = r16
  243. L14:
  244. r11 = r15
  245. L15:
  246. return r11
  247. [case testTupleBuiltFromList]
  248. def f(val: int) -> bool:
  249. return val % 2 == 0
  250. def test() -> None:
  251. source = [1, 2, 3]
  252. a = tuple(f(x) for x in source)
  253. [out]
  254. def f(val):
  255. val, r0 :: int
  256. r1 :: native_int
  257. r2, r3 :: bit
  258. r4 :: bool
  259. r5 :: bit
  260. L0:
  261. r0 = CPyTagged_Remainder(val, 4)
  262. r1 = r0 & 1
  263. r2 = r1 == 0
  264. if r2 goto L1 else goto L2 :: bool
  265. L1:
  266. r3 = r0 == 0
  267. r4 = r3
  268. goto L3
  269. L2:
  270. r5 = CPyTagged_IsEq_(r0, 0)
  271. r4 = r5
  272. L3:
  273. return r4
  274. def test():
  275. r0 :: list
  276. r1, r2, r3 :: object
  277. r4, r5, r6, r7 :: ptr
  278. source :: list
  279. r8 :: ptr
  280. r9 :: native_int
  281. r10 :: tuple
  282. r11 :: short_int
  283. r12 :: ptr
  284. r13 :: native_int
  285. r14 :: short_int
  286. r15 :: bit
  287. r16 :: object
  288. r17, x :: int
  289. r18 :: bool
  290. r19 :: object
  291. r20 :: bit
  292. r21 :: short_int
  293. a :: tuple
  294. L0:
  295. r0 = PyList_New(3)
  296. r1 = object 1
  297. r2 = object 2
  298. r3 = object 3
  299. r4 = get_element_ptr r0 ob_item :: PyListObject
  300. r5 = load_mem r4 :: ptr*
  301. set_mem r5, r1 :: builtins.object*
  302. r6 = r5 + WORD_SIZE*1
  303. set_mem r6, r2 :: builtins.object*
  304. r7 = r5 + WORD_SIZE*2
  305. set_mem r7, r3 :: builtins.object*
  306. keep_alive r0
  307. source = r0
  308. r8 = get_element_ptr source ob_size :: PyVarObject
  309. r9 = load_mem r8 :: native_int*
  310. keep_alive source
  311. r10 = PyTuple_New(r9)
  312. r11 = 0
  313. L1:
  314. r12 = get_element_ptr source ob_size :: PyVarObject
  315. r13 = load_mem r12 :: native_int*
  316. keep_alive source
  317. r14 = r13 << 1
  318. r15 = r11 < r14 :: signed
  319. if r15 goto L2 else goto L4 :: bool
  320. L2:
  321. r16 = CPyList_GetItemUnsafe(source, r11)
  322. r17 = unbox(int, r16)
  323. x = r17
  324. r18 = f(x)
  325. r19 = box(bool, r18)
  326. r20 = CPySequenceTuple_SetItemUnsafe(r10, r11, r19)
  327. L3:
  328. r21 = r11 + 2
  329. r11 = r21
  330. goto L1
  331. L4:
  332. a = r10
  333. return 1
  334. [case testTupleBuiltFromStr]
  335. def f2(val: str) -> str:
  336. return val + "f2"
  337. def test() -> None:
  338. source = "abc"
  339. a = tuple(f2(x) for x in source)
  340. [out]
  341. def f2(val):
  342. val, r0, r1 :: str
  343. L0:
  344. r0 = 'f2'
  345. r1 = PyUnicode_Concat(val, r0)
  346. return r1
  347. def test():
  348. r0, source :: str
  349. r1 :: native_int
  350. r2 :: bit
  351. r3 :: tuple
  352. r4 :: short_int
  353. r5 :: native_int
  354. r6 :: bit
  355. r7 :: short_int
  356. r8 :: bit
  357. r9, x, r10 :: str
  358. r11 :: bit
  359. r12 :: short_int
  360. a :: tuple
  361. L0:
  362. r0 = 'abc'
  363. source = r0
  364. r1 = CPyStr_Size_size_t(source)
  365. r2 = r1 >= 0 :: signed
  366. r3 = PyTuple_New(r1)
  367. r4 = 0
  368. L1:
  369. r5 = CPyStr_Size_size_t(source)
  370. r6 = r5 >= 0 :: signed
  371. r7 = r5 << 1
  372. r8 = r4 < r7 :: signed
  373. if r8 goto L2 else goto L4 :: bool
  374. L2:
  375. r9 = CPyStr_GetItem(source, r4)
  376. x = r9
  377. r10 = f2(x)
  378. r11 = CPySequenceTuple_SetItemUnsafe(r3, r4, r10)
  379. L3:
  380. r12 = r4 + 2
  381. r4 = r12
  382. goto L1
  383. L4:
  384. a = r3
  385. return 1
  386. [case testTupleBuiltFromVariableLengthTuple]
  387. from typing import Tuple
  388. def f(val: bool) -> bool:
  389. return not val
  390. def test(source: Tuple[bool, ...]) -> None:
  391. a = tuple(f(x) for x in source)
  392. [out]
  393. def f(val):
  394. val, r0 :: bool
  395. L0:
  396. r0 = val ^ 1
  397. return r0
  398. def test(source):
  399. source :: tuple
  400. r0 :: ptr
  401. r1 :: native_int
  402. r2 :: tuple
  403. r3 :: short_int
  404. r4 :: ptr
  405. r5 :: native_int
  406. r6 :: short_int
  407. r7 :: bit
  408. r8 :: object
  409. r9, x, r10 :: bool
  410. r11 :: object
  411. r12 :: bit
  412. r13 :: short_int
  413. a :: tuple
  414. L0:
  415. r0 = get_element_ptr source ob_size :: PyVarObject
  416. r1 = load_mem r0 :: native_int*
  417. keep_alive source
  418. r2 = PyTuple_New(r1)
  419. r3 = 0
  420. L1:
  421. r4 = get_element_ptr source ob_size :: PyVarObject
  422. r5 = load_mem r4 :: native_int*
  423. keep_alive source
  424. r6 = r5 << 1
  425. r7 = r3 < r6 :: signed
  426. if r7 goto L2 else goto L4 :: bool
  427. L2:
  428. r8 = CPySequenceTuple_GetItem(source, r3)
  429. r9 = unbox(bool, r8)
  430. x = r9
  431. r10 = f(x)
  432. r11 = box(bool, r10)
  433. r12 = CPySequenceTuple_SetItemUnsafe(r2, r3, r11)
  434. L3:
  435. r13 = r3 + 2
  436. r3 = r13
  437. goto L1
  438. L4:
  439. a = r2
  440. return 1