irbuild-lists.test 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. [case testListGet]
  2. from typing import List
  3. def f(x: List[int]) -> int:
  4. return x[0]
  5. [out]
  6. def f(x):
  7. x :: list
  8. r0 :: object
  9. r1 :: int
  10. L0:
  11. r0 = CPyList_GetItemShort(x, 0)
  12. r1 = unbox(int, r0)
  13. return r1
  14. [case testListOfListGet]
  15. from typing import List
  16. def f(x: List[List[int]]) -> List[int]:
  17. return x[0]
  18. [out]
  19. def f(x):
  20. x :: list
  21. r0 :: object
  22. r1 :: list
  23. L0:
  24. r0 = CPyList_GetItemShort(x, 0)
  25. r1 = cast(list, r0)
  26. return r1
  27. [case testListOfListGet2]
  28. from typing import List
  29. def f(x: List[List[int]]) -> int:
  30. return x[0][1]
  31. [out]
  32. def f(x):
  33. x :: list
  34. r0 :: object
  35. r1 :: list
  36. r2 :: object
  37. r3 :: int
  38. L0:
  39. r0 = CPyList_GetItemShortBorrow(x, 0)
  40. r1 = borrow cast(list, r0)
  41. r2 = CPyList_GetItemShort(r1, 2)
  42. r3 = unbox(int, r2)
  43. keep_alive x, r0
  44. return r3
  45. [case testListSet]
  46. from typing import List
  47. def f(x: List[int]) -> None:
  48. x[0] = 1
  49. [out]
  50. def f(x):
  51. x :: list
  52. r0 :: object
  53. r1 :: bit
  54. L0:
  55. r0 = object 1
  56. r1 = CPyList_SetItem(x, 0, r0)
  57. return 1
  58. [case testNewListEmpty]
  59. from typing import List
  60. def f() -> None:
  61. x = [] # type: List[int]
  62. [out]
  63. def f():
  64. r0, x :: list
  65. L0:
  66. r0 = PyList_New(0)
  67. x = r0
  68. return 1
  69. [case testNewListEmptyViaFunc]
  70. from typing import List
  71. def f() -> None:
  72. x: List[int] = list()
  73. [out]
  74. def f():
  75. r0, x :: list
  76. L0:
  77. r0 = PyList_New(0)
  78. x = r0
  79. return 1
  80. [case testNewListEmptyViaAlias]
  81. from typing import List
  82. ListAlias = list
  83. def f() -> None:
  84. x: List[int] = ListAlias()
  85. [out]
  86. def f():
  87. r0, x :: list
  88. L0:
  89. r0 = PyList_New(0)
  90. x = r0
  91. return 1
  92. [case testNewListTwoItems]
  93. from typing import List
  94. def f() -> None:
  95. x: List[int] = [1, 2]
  96. [out]
  97. def f():
  98. r0 :: list
  99. r1, r2 :: object
  100. r3, r4, r5 :: ptr
  101. x :: list
  102. L0:
  103. r0 = PyList_New(2)
  104. r1 = object 1
  105. r2 = object 2
  106. r3 = get_element_ptr r0 ob_item :: PyListObject
  107. r4 = load_mem r3 :: ptr*
  108. set_mem r4, r1 :: builtins.object*
  109. r5 = r4 + WORD_SIZE*1
  110. set_mem r5, r2 :: builtins.object*
  111. keep_alive r0
  112. x = r0
  113. return 1
  114. [case testNewListTenItems]
  115. from typing import List
  116. def f() -> None:
  117. x: List[str] = ['a', 'b', 'c', 'd', 'e',
  118. 'f', 'g', 'h', 'i', 'j']
  119. [out]
  120. def f():
  121. r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 :: str
  122. r10, x :: list
  123. L0:
  124. r0 = 'a'
  125. r1 = 'b'
  126. r2 = 'c'
  127. r3 = 'd'
  128. r4 = 'e'
  129. r5 = 'f'
  130. r6 = 'g'
  131. r7 = 'h'
  132. r8 = 'i'
  133. r9 = 'j'
  134. r10 = CPyList_Build(10, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9)
  135. x = r10
  136. return 1
  137. [case testListMultiply]
  138. from typing import List
  139. def f(a: List[int]) -> None:
  140. b = a * 2
  141. b = 3 * [4]
  142. [out]
  143. def f(a):
  144. a, r0, b, r1 :: list
  145. r2 :: object
  146. r3, r4 :: ptr
  147. r5 :: list
  148. L0:
  149. r0 = CPySequence_Multiply(a, 4)
  150. b = r0
  151. r1 = PyList_New(1)
  152. r2 = object 4
  153. r3 = get_element_ptr r1 ob_item :: PyListObject
  154. r4 = load_mem r3 :: ptr*
  155. set_mem r4, r2 :: builtins.object*
  156. keep_alive r1
  157. r5 = CPySequence_RMultiply(6, r1)
  158. b = r5
  159. return 1
  160. [case testListLen]
  161. from typing import List
  162. def f(a: List[int]) -> int:
  163. return len(a)
  164. [out]
  165. def f(a):
  166. a :: list
  167. r0 :: ptr
  168. r1 :: native_int
  169. r2 :: short_int
  170. L0:
  171. r0 = get_element_ptr a ob_size :: PyVarObject
  172. r1 = load_mem r0 :: native_int*
  173. keep_alive a
  174. r2 = r1 << 1
  175. return r2
  176. [case testListAppend]
  177. from typing import List
  178. def f(a: List[int], x: int) -> None:
  179. a.append(x)
  180. [out]
  181. def f(a, x):
  182. a :: list
  183. x :: int
  184. r0 :: object
  185. r1 :: i32
  186. r2 :: bit
  187. L0:
  188. r0 = box(int, x)
  189. r1 = PyList_Append(a, r0)
  190. r2 = r1 >= 0 :: signed
  191. return 1
  192. [case testIndexLvalue]
  193. from typing import List
  194. def increment(l: List[int]) -> List[int]:
  195. for i in range(len(l)):
  196. l[i] += 1
  197. return l
  198. [out]
  199. def increment(l):
  200. l :: list
  201. r0 :: ptr
  202. r1 :: native_int
  203. r2, r3 :: short_int
  204. i :: int
  205. r4 :: bit
  206. r5, r6, r7 :: object
  207. r8 :: bit
  208. r9 :: short_int
  209. L0:
  210. r0 = get_element_ptr l ob_size :: PyVarObject
  211. r1 = load_mem r0 :: native_int*
  212. keep_alive l
  213. r2 = r1 << 1
  214. r3 = 0
  215. i = r3
  216. L1:
  217. r4 = r3 < r2 :: signed
  218. if r4 goto L2 else goto L4 :: bool
  219. L2:
  220. r5 = CPyList_GetItem(l, i)
  221. r6 = object 1
  222. r7 = PyNumber_InPlaceAdd(r5, r6)
  223. r8 = CPyList_SetItem(l, i, r7)
  224. L3:
  225. r9 = r3 + 2
  226. r3 = r9
  227. i = r9
  228. goto L1
  229. L4:
  230. return l
  231. [case testListDisplay]
  232. from typing import List
  233. def f(x: List[int], y: List[int]) -> List[int]:
  234. return [1, 2, *x, *y, 3]
  235. [out]
  236. def f(x, y):
  237. x, y, r0 :: list
  238. r1, r2 :: object
  239. r3, r4, r5 :: ptr
  240. r6, r7, r8 :: object
  241. r9 :: i32
  242. r10 :: bit
  243. L0:
  244. r0 = PyList_New(2)
  245. r1 = object 1
  246. r2 = object 2
  247. r3 = get_element_ptr r0 ob_item :: PyListObject
  248. r4 = load_mem r3 :: ptr*
  249. set_mem r4, r1 :: builtins.object*
  250. r5 = r4 + WORD_SIZE*1
  251. set_mem r5, r2 :: builtins.object*
  252. keep_alive r0
  253. r6 = CPyList_Extend(r0, x)
  254. r7 = CPyList_Extend(r0, y)
  255. r8 = object 3
  256. r9 = PyList_Append(r0, r8)
  257. r10 = r9 >= 0 :: signed
  258. return r0
  259. [case testListIn]
  260. from typing import List
  261. def f(x: List[int], y: int) -> bool:
  262. return y in x
  263. [out]
  264. def f(x, y):
  265. x :: list
  266. y :: int
  267. r0 :: object
  268. r1 :: i32
  269. r2 :: bit
  270. r3 :: bool
  271. L0:
  272. r0 = box(int, y)
  273. r1 = PySequence_Contains(x, r0)
  274. r2 = r1 >= 0 :: signed
  275. r3 = truncate r1: i32 to builtins.bool
  276. return r3
  277. [case testListInsert]
  278. from typing import List
  279. def f(x: List[int], y: int) -> None:
  280. x.insert(0, y)
  281. [out]
  282. def f(x, y):
  283. x :: list
  284. y :: int
  285. r0 :: object
  286. r1 :: i32
  287. r2 :: bit
  288. L0:
  289. r0 = box(int, y)
  290. r1 = CPyList_Insert(x, 0, r0)
  291. r2 = r1 >= 0 :: signed
  292. return 1
  293. [case testListBuiltFromGenerator]
  294. from typing import List
  295. def f(source: List[int]) -> None:
  296. a = list(x + 1 for x in source)
  297. b = [x + 1 for x in source]
  298. [out]
  299. def f(source):
  300. source :: list
  301. r0 :: ptr
  302. r1 :: native_int
  303. r2 :: list
  304. r3 :: short_int
  305. r4 :: ptr
  306. r5 :: native_int
  307. r6 :: short_int
  308. r7 :: bit
  309. r8 :: object
  310. r9, x, r10 :: int
  311. r11 :: object
  312. r12 :: bit
  313. r13 :: short_int
  314. a :: list
  315. r14 :: ptr
  316. r15 :: native_int
  317. r16 :: list
  318. r17 :: short_int
  319. r18 :: ptr
  320. r19 :: native_int
  321. r20 :: short_int
  322. r21 :: bit
  323. r22 :: object
  324. r23, x_2, r24 :: int
  325. r25 :: object
  326. r26 :: bit
  327. r27 :: short_int
  328. b :: list
  329. L0:
  330. r0 = get_element_ptr source ob_size :: PyVarObject
  331. r1 = load_mem r0 :: native_int*
  332. keep_alive source
  333. r2 = PyList_New(r1)
  334. r3 = 0
  335. L1:
  336. r4 = get_element_ptr source ob_size :: PyVarObject
  337. r5 = load_mem r4 :: native_int*
  338. keep_alive source
  339. r6 = r5 << 1
  340. r7 = r3 < r6 :: signed
  341. if r7 goto L2 else goto L4 :: bool
  342. L2:
  343. r8 = CPyList_GetItemUnsafe(source, r3)
  344. r9 = unbox(int, r8)
  345. x = r9
  346. r10 = CPyTagged_Add(x, 2)
  347. r11 = box(int, r10)
  348. r12 = CPyList_SetItemUnsafe(r2, r3, r11)
  349. L3:
  350. r13 = r3 + 2
  351. r3 = r13
  352. goto L1
  353. L4:
  354. a = r2
  355. r14 = get_element_ptr source ob_size :: PyVarObject
  356. r15 = load_mem r14 :: native_int*
  357. keep_alive source
  358. r16 = PyList_New(r15)
  359. r17 = 0
  360. L5:
  361. r18 = get_element_ptr source ob_size :: PyVarObject
  362. r19 = load_mem r18 :: native_int*
  363. keep_alive source
  364. r20 = r19 << 1
  365. r21 = r17 < r20 :: signed
  366. if r21 goto L6 else goto L8 :: bool
  367. L6:
  368. r22 = CPyList_GetItemUnsafe(source, r17)
  369. r23 = unbox(int, r22)
  370. x_2 = r23
  371. r24 = CPyTagged_Add(x_2, 2)
  372. r25 = box(int, r24)
  373. r26 = CPyList_SetItemUnsafe(r16, r17, r25)
  374. L7:
  375. r27 = r17 + 2
  376. r17 = r27
  377. goto L5
  378. L8:
  379. b = r16
  380. return 1
  381. [case testGeneratorNext]
  382. from typing import List, Optional
  383. def test(x: List[int]) -> None:
  384. res = next((i for i in x), None)
  385. [out]
  386. def test(x):
  387. x :: list
  388. r0 :: short_int
  389. r1 :: ptr
  390. r2 :: native_int
  391. r3 :: short_int
  392. r4 :: bit
  393. r5 :: object
  394. r6, i :: int
  395. r7 :: object
  396. r8 :: union[int, None]
  397. r9 :: short_int
  398. r10 :: object
  399. res :: union[int, None]
  400. L0:
  401. r0 = 0
  402. L1:
  403. r1 = get_element_ptr x ob_size :: PyVarObject
  404. r2 = load_mem r1 :: native_int*
  405. keep_alive x
  406. r3 = r2 << 1
  407. r4 = r0 < r3 :: signed
  408. if r4 goto L2 else goto L4 :: bool
  409. L2:
  410. r5 = CPyList_GetItemUnsafe(x, r0)
  411. r6 = unbox(int, r5)
  412. i = r6
  413. r7 = box(int, i)
  414. r8 = r7
  415. goto L5
  416. L3:
  417. r9 = r0 + 2
  418. r0 = r9
  419. goto L1
  420. L4:
  421. r10 = box(None, 1)
  422. r8 = r10
  423. L5:
  424. res = r8
  425. return 1
  426. [case testSimplifyListUnion]
  427. from typing import List, Union, Optional
  428. def narrow(a: Union[List[str], List[bytes], int]) -> int:
  429. if isinstance(a, list):
  430. return len(a)
  431. return a
  432. def loop(a: Union[List[str], List[bytes]]) -> None:
  433. for x in a:
  434. pass
  435. def nested_union(a: Union[List[str], List[Optional[str]]]) -> None:
  436. for x in a:
  437. pass
  438. [out]
  439. def narrow(a):
  440. a :: union[list, int]
  441. r0 :: object
  442. r1 :: i32
  443. r2 :: bit
  444. r3 :: bool
  445. r4 :: list
  446. r5 :: ptr
  447. r6 :: native_int
  448. r7 :: short_int
  449. r8 :: int
  450. L0:
  451. r0 = load_address PyList_Type
  452. r1 = PyObject_IsInstance(a, r0)
  453. r2 = r1 >= 0 :: signed
  454. r3 = truncate r1: i32 to builtins.bool
  455. if r3 goto L1 else goto L2 :: bool
  456. L1:
  457. r4 = borrow cast(list, a)
  458. r5 = get_element_ptr r4 ob_size :: PyVarObject
  459. r6 = load_mem r5 :: native_int*
  460. keep_alive r4
  461. r7 = r6 << 1
  462. keep_alive a
  463. return r7
  464. L2:
  465. r8 = unbox(int, a)
  466. return r8
  467. def loop(a):
  468. a :: list
  469. r0 :: short_int
  470. r1 :: ptr
  471. r2 :: native_int
  472. r3 :: short_int
  473. r4 :: bit
  474. r5 :: object
  475. r6, x :: union[str, bytes]
  476. r7 :: short_int
  477. L0:
  478. r0 = 0
  479. L1:
  480. r1 = get_element_ptr a ob_size :: PyVarObject
  481. r2 = load_mem r1 :: native_int*
  482. keep_alive a
  483. r3 = r2 << 1
  484. r4 = r0 < r3 :: signed
  485. if r4 goto L2 else goto L4 :: bool
  486. L2:
  487. r5 = CPyList_GetItemUnsafe(a, r0)
  488. r6 = cast(union[str, bytes], r5)
  489. x = r6
  490. L3:
  491. r7 = r0 + 2
  492. r0 = r7
  493. goto L1
  494. L4:
  495. return 1
  496. def nested_union(a):
  497. a :: list
  498. r0 :: short_int
  499. r1 :: ptr
  500. r2 :: native_int
  501. r3 :: short_int
  502. r4 :: bit
  503. r5 :: object
  504. r6, x :: union[str, None]
  505. r7 :: short_int
  506. L0:
  507. r0 = 0
  508. L1:
  509. r1 = get_element_ptr a ob_size :: PyVarObject
  510. r2 = load_mem r1 :: native_int*
  511. keep_alive a
  512. r3 = r2 << 1
  513. r4 = r0 < r3 :: signed
  514. if r4 goto L2 else goto L4 :: bool
  515. L2:
  516. r5 = CPyList_GetItemUnsafe(a, r0)
  517. r6 = cast(union[str, None], r5)
  518. x = r6
  519. L3:
  520. r7 = r0 + 2
  521. r0 = r7
  522. goto L1
  523. L4:
  524. return 1