irbuild-statements.test 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. [case testForInRange]
  2. def f() -> None:
  3. x = 0
  4. for i in range(5):
  5. x = x + i
  6. [out]
  7. def f():
  8. x :: int
  9. r0 :: short_int
  10. i :: int
  11. r1 :: bit
  12. r2 :: int
  13. r3 :: short_int
  14. L0:
  15. x = 0
  16. r0 = 0
  17. i = r0
  18. L1:
  19. r1 = r0 < 10 :: signed
  20. if r1 goto L2 else goto L4 :: bool
  21. L2:
  22. r2 = CPyTagged_Add(x, i)
  23. x = r2
  24. L3:
  25. r3 = r0 + 2
  26. r0 = r3
  27. i = r3
  28. goto L1
  29. L4:
  30. return 1
  31. [case testForInRangeVariableEndIndxe]
  32. def f(a: int) -> None:
  33. for i in range(a):
  34. pass
  35. [out]
  36. def f(a):
  37. a, r0, i :: int
  38. r1 :: native_int
  39. r2 :: bit
  40. r3 :: native_int
  41. r4, r5, r6 :: bit
  42. r7 :: bool
  43. r8 :: bit
  44. r9 :: int
  45. L0:
  46. r0 = 0
  47. i = r0
  48. L1:
  49. r1 = r0 & 1
  50. r2 = r1 == 0
  51. r3 = a & 1
  52. r4 = r3 == 0
  53. r5 = r2 & r4
  54. if r5 goto L2 else goto L3 :: bool
  55. L2:
  56. r6 = r0 < a :: signed
  57. r7 = r6
  58. goto L4
  59. L3:
  60. r8 = CPyTagged_IsLt_(r0, a)
  61. r7 = r8
  62. L4:
  63. if r7 goto L5 else goto L7 :: bool
  64. L5:
  65. L6:
  66. r9 = CPyTagged_Add(r0, 2)
  67. r0 = r9
  68. i = r9
  69. goto L1
  70. L7:
  71. return 1
  72. [case testForInNegativeRange]
  73. def f() -> None:
  74. for i in range(10, 0, -1):
  75. pass
  76. [out]
  77. def f():
  78. r0 :: short_int
  79. i :: int
  80. r1 :: bit
  81. r2 :: short_int
  82. L0:
  83. r0 = 20
  84. i = r0
  85. L1:
  86. r1 = r0 > 0 :: signed
  87. if r1 goto L2 else goto L4 :: bool
  88. L2:
  89. L3:
  90. r2 = r0 + -2
  91. r0 = r2
  92. i = r2
  93. goto L1
  94. L4:
  95. return 1
  96. [case testBreak]
  97. def f() -> None:
  98. n = 0
  99. while n < 5:
  100. break
  101. [out]
  102. def f():
  103. n :: int
  104. r0 :: native_int
  105. r1, r2, r3 :: bit
  106. L0:
  107. n = 0
  108. L1:
  109. r0 = n & 1
  110. r1 = r0 != 0
  111. if r1 goto L2 else goto L3 :: bool
  112. L2:
  113. r2 = CPyTagged_IsLt_(n, 10)
  114. if r2 goto L4 else goto L5 :: bool
  115. L3:
  116. r3 = n < 10 :: signed
  117. if r3 goto L4 else goto L5 :: bool
  118. L4:
  119. L5:
  120. return 1
  121. [case testBreakFor]
  122. def f() -> None:
  123. for n in range(5):
  124. break
  125. [out]
  126. def f():
  127. r0 :: short_int
  128. n :: int
  129. r1 :: bit
  130. r2 :: short_int
  131. L0:
  132. r0 = 0
  133. n = r0
  134. L1:
  135. r1 = r0 < 10 :: signed
  136. if r1 goto L2 else goto L4 :: bool
  137. L2:
  138. goto L4
  139. L3:
  140. r2 = r0 + 2
  141. r0 = r2
  142. n = r2
  143. goto L1
  144. L4:
  145. return 1
  146. [case testBreakNested]
  147. def f() -> None:
  148. n = 0
  149. while n < 5:
  150. while n < 4:
  151. break
  152. break
  153. [out]
  154. def f():
  155. n :: int
  156. r0 :: native_int
  157. r1, r2, r3 :: bit
  158. r4 :: native_int
  159. r5, r6, r7 :: bit
  160. L0:
  161. n = 0
  162. L1:
  163. r0 = n & 1
  164. r1 = r0 != 0
  165. if r1 goto L2 else goto L3 :: bool
  166. L2:
  167. r2 = CPyTagged_IsLt_(n, 10)
  168. if r2 goto L4 else goto L10 :: bool
  169. L3:
  170. r3 = n < 10 :: signed
  171. if r3 goto L4 else goto L10 :: bool
  172. L4:
  173. L5:
  174. r4 = n & 1
  175. r5 = r4 != 0
  176. if r5 goto L6 else goto L7 :: bool
  177. L6:
  178. r6 = CPyTagged_IsLt_(n, 8)
  179. if r6 goto L8 else goto L9 :: bool
  180. L7:
  181. r7 = n < 8 :: signed
  182. if r7 goto L8 else goto L9 :: bool
  183. L8:
  184. L9:
  185. L10:
  186. return 1
  187. [case testContinue]
  188. def f() -> None:
  189. n = 0
  190. while n < 5:
  191. continue
  192. [out]
  193. def f():
  194. n :: int
  195. r0 :: native_int
  196. r1, r2, r3 :: bit
  197. L0:
  198. n = 0
  199. L1:
  200. r0 = n & 1
  201. r1 = r0 != 0
  202. if r1 goto L2 else goto L3 :: bool
  203. L2:
  204. r2 = CPyTagged_IsLt_(n, 10)
  205. if r2 goto L4 else goto L5 :: bool
  206. L3:
  207. r3 = n < 10 :: signed
  208. if r3 goto L4 else goto L5 :: bool
  209. L4:
  210. goto L1
  211. L5:
  212. return 1
  213. [case testContinueFor]
  214. def f() -> None:
  215. for n in range(5):
  216. continue
  217. [out]
  218. def f():
  219. r0 :: short_int
  220. n :: int
  221. r1 :: bit
  222. r2 :: short_int
  223. L0:
  224. r0 = 0
  225. n = r0
  226. L1:
  227. r1 = r0 < 10 :: signed
  228. if r1 goto L2 else goto L4 :: bool
  229. L2:
  230. L3:
  231. r2 = r0 + 2
  232. r0 = r2
  233. n = r2
  234. goto L1
  235. L4:
  236. return 1
  237. [case testContinueNested]
  238. def f() -> None:
  239. n = 0
  240. while n < 5:
  241. while n < 4:
  242. continue
  243. continue
  244. [out]
  245. def f():
  246. n :: int
  247. r0 :: native_int
  248. r1, r2, r3 :: bit
  249. r4 :: native_int
  250. r5, r6, r7 :: bit
  251. L0:
  252. n = 0
  253. L1:
  254. r0 = n & 1
  255. r1 = r0 != 0
  256. if r1 goto L2 else goto L3 :: bool
  257. L2:
  258. r2 = CPyTagged_IsLt_(n, 10)
  259. if r2 goto L4 else goto L10 :: bool
  260. L3:
  261. r3 = n < 10 :: signed
  262. if r3 goto L4 else goto L10 :: bool
  263. L4:
  264. L5:
  265. r4 = n & 1
  266. r5 = r4 != 0
  267. if r5 goto L6 else goto L7 :: bool
  268. L6:
  269. r6 = CPyTagged_IsLt_(n, 8)
  270. if r6 goto L8 else goto L9 :: bool
  271. L7:
  272. r7 = n < 8 :: signed
  273. if r7 goto L8 else goto L9 :: bool
  274. L8:
  275. goto L5
  276. L9:
  277. goto L1
  278. L10:
  279. return 1
  280. [case testForList]
  281. from typing import List
  282. def f(ls: List[int]) -> int:
  283. y = 0
  284. for x in ls:
  285. y = y + x
  286. return y
  287. [out]
  288. def f(ls):
  289. ls :: list
  290. y :: int
  291. r0 :: short_int
  292. r1 :: ptr
  293. r2 :: native_int
  294. r3 :: short_int
  295. r4 :: bit
  296. r5 :: object
  297. r6, x, r7 :: int
  298. r8 :: short_int
  299. L0:
  300. y = 0
  301. r0 = 0
  302. L1:
  303. r1 = get_element_ptr ls ob_size :: PyVarObject
  304. r2 = load_mem r1 :: native_int*
  305. keep_alive ls
  306. r3 = r2 << 1
  307. r4 = r0 < r3 :: signed
  308. if r4 goto L2 else goto L4 :: bool
  309. L2:
  310. r5 = CPyList_GetItemUnsafe(ls, r0)
  311. r6 = unbox(int, r5)
  312. x = r6
  313. r7 = CPyTagged_Add(y, x)
  314. y = r7
  315. L3:
  316. r8 = r0 + 2
  317. r0 = r8
  318. goto L1
  319. L4:
  320. return y
  321. [case testForDictBasic]
  322. from typing import Dict
  323. def f(d: Dict[int, int]) -> None:
  324. for key in d:
  325. d[key]
  326. [out]
  327. def f(d):
  328. d :: dict
  329. r0 :: short_int
  330. r1 :: native_int
  331. r2 :: short_int
  332. r3 :: object
  333. r4 :: tuple[bool, short_int, object]
  334. r5 :: short_int
  335. r6 :: bool
  336. r7 :: object
  337. r8, key :: int
  338. r9, r10 :: object
  339. r11 :: int
  340. r12, r13 :: bit
  341. L0:
  342. r0 = 0
  343. r1 = PyDict_Size(d)
  344. r2 = r1 << 1
  345. r3 = CPyDict_GetKeysIter(d)
  346. L1:
  347. r4 = CPyDict_NextKey(r3, r0)
  348. r5 = r4[1]
  349. r0 = r5
  350. r6 = r4[0]
  351. if r6 goto L2 else goto L4 :: bool
  352. L2:
  353. r7 = r4[2]
  354. r8 = unbox(int, r7)
  355. key = r8
  356. r9 = box(int, key)
  357. r10 = CPyDict_GetItem(d, r9)
  358. r11 = unbox(int, r10)
  359. L3:
  360. r12 = CPyDict_CheckSize(d, r2)
  361. goto L1
  362. L4:
  363. r13 = CPy_NoErrOccured()
  364. L5:
  365. return 1
  366. [case testForDictContinue]
  367. from typing import Dict
  368. def sum_over_even_values(d: Dict[int, int]) -> int:
  369. s = 0
  370. for key in d:
  371. if d[key] % 2:
  372. continue
  373. s = s + d[key]
  374. return s
  375. [out]
  376. def sum_over_even_values(d):
  377. d :: dict
  378. s :: int
  379. r0 :: short_int
  380. r1 :: native_int
  381. r2 :: short_int
  382. r3 :: object
  383. r4 :: tuple[bool, short_int, object]
  384. r5 :: short_int
  385. r6 :: bool
  386. r7 :: object
  387. r8, key :: int
  388. r9, r10 :: object
  389. r11, r12 :: int
  390. r13 :: bit
  391. r14, r15 :: object
  392. r16, r17 :: int
  393. r18, r19 :: bit
  394. L0:
  395. s = 0
  396. r0 = 0
  397. r1 = PyDict_Size(d)
  398. r2 = r1 << 1
  399. r3 = CPyDict_GetKeysIter(d)
  400. L1:
  401. r4 = CPyDict_NextKey(r3, r0)
  402. r5 = r4[1]
  403. r0 = r5
  404. r6 = r4[0]
  405. if r6 goto L2 else goto L6 :: bool
  406. L2:
  407. r7 = r4[2]
  408. r8 = unbox(int, r7)
  409. key = r8
  410. r9 = box(int, key)
  411. r10 = CPyDict_GetItem(d, r9)
  412. r11 = unbox(int, r10)
  413. r12 = CPyTagged_Remainder(r11, 4)
  414. r13 = r12 != 0
  415. if r13 goto L3 else goto L4 :: bool
  416. L3:
  417. goto L5
  418. L4:
  419. r14 = box(int, key)
  420. r15 = CPyDict_GetItem(d, r14)
  421. r16 = unbox(int, r15)
  422. r17 = CPyTagged_Add(s, r16)
  423. s = r17
  424. L5:
  425. r18 = CPyDict_CheckSize(d, r2)
  426. goto L1
  427. L6:
  428. r19 = CPy_NoErrOccured()
  429. L7:
  430. return s
  431. [case testMultipleAssignmentWithNoUnpacking]
  432. from typing import Tuple
  433. def f(x: int, y: int) -> Tuple[int, int]:
  434. x, y = y, x
  435. return (x, y)
  436. def f2(x: int, y: str, z: float) -> Tuple[float, str, int]:
  437. a, b, c = x, y, z
  438. return (c, b, a)
  439. def f3(x: int, y: int) -> Tuple[int, int]:
  440. [x, y] = [y, x]
  441. return (x, y)
  442. [out]
  443. def f(x, y):
  444. x, y, r0, r1 :: int
  445. r2 :: tuple[int, int]
  446. L0:
  447. r0 = y
  448. r1 = x
  449. x = r0
  450. y = r1
  451. r2 = (x, y)
  452. return r2
  453. def f2(x, y, z):
  454. x :: int
  455. y :: str
  456. z :: float
  457. r0 :: int
  458. r1 :: str
  459. r2 :: float
  460. a :: int
  461. b :: str
  462. c :: float
  463. r3 :: tuple[float, str, int]
  464. L0:
  465. r0 = x
  466. r1 = y
  467. r2 = z
  468. a = r0
  469. b = r1
  470. c = r2
  471. r3 = (c, b, a)
  472. return r3
  473. def f3(x, y):
  474. x, y, r0, r1 :: int
  475. r2 :: tuple[int, int]
  476. L0:
  477. r0 = y
  478. r1 = x
  479. x = r0
  480. y = r1
  481. r2 = (x, y)
  482. return r2
  483. [case testMultipleAssignmentBasicUnpacking]
  484. from typing import Tuple, Any
  485. def from_tuple(t: Tuple[int, str]) -> None:
  486. x, y = t
  487. def from_any(a: Any) -> None:
  488. x, y = a
  489. [out]
  490. def from_tuple(t):
  491. t :: tuple[int, str]
  492. r0, x :: int
  493. r1, y :: str
  494. L0:
  495. r0 = t[0]
  496. x = r0
  497. r1 = t[1]
  498. y = r1
  499. return 1
  500. def from_any(a):
  501. a, r0, r1 :: object
  502. r2 :: bool
  503. x, r3 :: object
  504. r4 :: bool
  505. y, r5 :: object
  506. r6 :: bool
  507. L0:
  508. r0 = PyObject_GetIter(a)
  509. r1 = PyIter_Next(r0)
  510. if is_error(r1) goto L1 else goto L2
  511. L1:
  512. r2 = raise ValueError('not enough values to unpack')
  513. unreachable
  514. L2:
  515. x = r1
  516. r3 = PyIter_Next(r0)
  517. if is_error(r3) goto L3 else goto L4
  518. L3:
  519. r4 = raise ValueError('not enough values to unpack')
  520. unreachable
  521. L4:
  522. y = r3
  523. r5 = PyIter_Next(r0)
  524. if is_error(r5) goto L6 else goto L5
  525. L5:
  526. r6 = raise ValueError('too many values to unpack')
  527. unreachable
  528. L6:
  529. return 1
  530. [case testMultiAssignmentCoercions]
  531. from typing import Tuple, Any
  532. def from_tuple(t: Tuple[int, Any]) -> None:
  533. x: object
  534. y: int
  535. x, y = t
  536. def from_any(a: Any) -> None:
  537. x: int
  538. x, y = a
  539. [out]
  540. def from_tuple(t):
  541. t :: tuple[int, object]
  542. r0 :: int
  543. r1, x, r2 :: object
  544. r3, y :: int
  545. L0:
  546. r0 = t[0]
  547. r1 = box(int, r0)
  548. x = r1
  549. r2 = t[1]
  550. r3 = unbox(int, r2)
  551. y = r3
  552. return 1
  553. def from_any(a):
  554. a, r0, r1 :: object
  555. r2 :: bool
  556. r3, x :: int
  557. r4 :: object
  558. r5 :: bool
  559. y, r6 :: object
  560. r7 :: bool
  561. L0:
  562. r0 = PyObject_GetIter(a)
  563. r1 = PyIter_Next(r0)
  564. if is_error(r1) goto L1 else goto L2
  565. L1:
  566. r2 = raise ValueError('not enough values to unpack')
  567. unreachable
  568. L2:
  569. r3 = unbox(int, r1)
  570. x = r3
  571. r4 = PyIter_Next(r0)
  572. if is_error(r4) goto L3 else goto L4
  573. L3:
  574. r5 = raise ValueError('not enough values to unpack')
  575. unreachable
  576. L4:
  577. y = r4
  578. r6 = PyIter_Next(r0)
  579. if is_error(r6) goto L6 else goto L5
  580. L5:
  581. r7 = raise ValueError('too many values to unpack')
  582. unreachable
  583. L6:
  584. return 1
  585. [case testMultiAssignmentNested]
  586. from typing import Tuple, Any, List
  587. class A:
  588. x: int
  589. def multi_assign(t: Tuple[int, Tuple[str, Any]], a: A, l: List[str]) -> None:
  590. z: int
  591. a.x, (l[0], z) = t
  592. [out]
  593. def multi_assign(t, a, l):
  594. t :: tuple[int, tuple[str, object]]
  595. a :: __main__.A
  596. l :: list
  597. r0 :: int
  598. r1 :: bool
  599. r2 :: tuple[str, object]
  600. r3 :: str
  601. r4 :: bit
  602. r5 :: object
  603. r6, z :: int
  604. L0:
  605. r0 = t[0]
  606. a.x = r0; r1 = is_error
  607. r2 = t[1]
  608. r3 = r2[0]
  609. r4 = CPyList_SetItem(l, 0, r3)
  610. r5 = r2[1]
  611. r6 = unbox(int, r5)
  612. z = r6
  613. return 1
  614. [case testMultipleAssignmentUnpackFromSequence]
  615. from typing import List, Tuple
  616. def f(l: List[int], t: Tuple[int, ...]) -> None:
  617. x: object
  618. y: int
  619. x, y = l
  620. x, y = t
  621. [out]
  622. def f(l, t):
  623. l :: list
  624. t :: tuple
  625. r0 :: int32
  626. r1 :: bit
  627. r2, r3, x :: object
  628. r4, y :: int
  629. r5 :: int32
  630. r6 :: bit
  631. r7, r8 :: object
  632. r9 :: int
  633. L0:
  634. r0 = CPySequence_CheckUnpackCount(l, 2)
  635. r1 = r0 >= 0 :: signed
  636. r2 = CPyList_GetItemUnsafe(l, 0)
  637. r3 = CPyList_GetItemUnsafe(l, 2)
  638. x = r2
  639. r4 = unbox(int, r3)
  640. y = r4
  641. r5 = CPySequence_CheckUnpackCount(t, 2)
  642. r6 = r5 >= 0 :: signed
  643. r7 = CPySequenceTuple_GetItem(t, 0)
  644. r8 = CPySequenceTuple_GetItem(t, 2)
  645. r9 = unbox(int, r8)
  646. x = r7
  647. y = r9
  648. return 1
  649. [case testAssert]
  650. from typing import Optional
  651. def no_msg(x: bool) -> int:
  652. assert x
  653. return 1
  654. def literal_msg(x: object) -> int:
  655. assert x, 'message'
  656. return 2
  657. def complex_msg(x: Optional[str], s: str) -> None:
  658. assert x, s
  659. [out]
  660. def no_msg(x):
  661. x, r0 :: bool
  662. L0:
  663. if x goto L2 else goto L1 :: bool
  664. L1:
  665. r0 = raise AssertionError
  666. unreachable
  667. L2:
  668. return 2
  669. def literal_msg(x):
  670. x :: object
  671. r0 :: int32
  672. r1 :: bit
  673. r2, r3 :: bool
  674. L0:
  675. r0 = PyObject_IsTrue(x)
  676. r1 = r0 >= 0 :: signed
  677. r2 = truncate r0: int32 to builtins.bool
  678. if r2 goto L2 else goto L1 :: bool
  679. L1:
  680. r3 = raise AssertionError('message')
  681. unreachable
  682. L2:
  683. return 4
  684. def complex_msg(x, s):
  685. x :: union[str, None]
  686. s :: str
  687. r0 :: object
  688. r1 :: bit
  689. r2 :: str
  690. r3 :: bit
  691. r4 :: object
  692. r5 :: str
  693. r6, r7 :: object
  694. L0:
  695. r0 = load_address _Py_NoneStruct
  696. r1 = x != r0
  697. if r1 goto L1 else goto L2 :: bool
  698. L1:
  699. r2 = cast(str, x)
  700. r3 = CPyStr_IsTrue(r2)
  701. if r3 goto L3 else goto L2 :: bool
  702. L2:
  703. r4 = builtins :: module
  704. r5 = 'AssertionError'
  705. r6 = CPyObject_GetAttr(r4, r5)
  706. r7 = PyObject_CallFunctionObjArgs(r6, s, 0)
  707. CPy_Raise(r7)
  708. unreachable
  709. L3:
  710. return 1
  711. [case testDelList]
  712. def delList() -> None:
  713. l = [1, 2]
  714. del l[1]
  715. def delListMultiple() -> None:
  716. l = [1, 2, 3, 4, 5, 6, 7]
  717. del l[1], l[2], l[3]
  718. [out]
  719. def delList():
  720. r0 :: list
  721. r1, r2 :: object
  722. r3, r4, r5 :: ptr
  723. l :: list
  724. r6 :: object
  725. r7 :: int32
  726. r8 :: bit
  727. L0:
  728. r0 = PyList_New(2)
  729. r1 = object 1
  730. r2 = object 2
  731. r3 = get_element_ptr r0 ob_item :: PyListObject
  732. r4 = load_mem r3 :: ptr*
  733. set_mem r4, r1 :: builtins.object*
  734. r5 = r4 + WORD_SIZE*1
  735. set_mem r5, r2 :: builtins.object*
  736. keep_alive r0
  737. l = r0
  738. r6 = object 1
  739. r7 = PyObject_DelItem(l, r6)
  740. r8 = r7 >= 0 :: signed
  741. return 1
  742. def delListMultiple():
  743. r0 :: list
  744. r1, r2, r3, r4, r5, r6, r7 :: object
  745. r8, r9, r10, r11, r12, r13, r14, r15 :: ptr
  746. l :: list
  747. r16 :: object
  748. r17 :: int32
  749. r18 :: bit
  750. r19 :: object
  751. r20 :: int32
  752. r21 :: bit
  753. r22 :: object
  754. r23 :: int32
  755. r24 :: bit
  756. L0:
  757. r0 = PyList_New(7)
  758. r1 = object 1
  759. r2 = object 2
  760. r3 = object 3
  761. r4 = object 4
  762. r5 = object 5
  763. r6 = object 6
  764. r7 = object 7
  765. r8 = get_element_ptr r0 ob_item :: PyListObject
  766. r9 = load_mem r8 :: ptr*
  767. set_mem r9, r1 :: builtins.object*
  768. r10 = r9 + WORD_SIZE*1
  769. set_mem r10, r2 :: builtins.object*
  770. r11 = r9 + WORD_SIZE*2
  771. set_mem r11, r3 :: builtins.object*
  772. r12 = r9 + WORD_SIZE*3
  773. set_mem r12, r4 :: builtins.object*
  774. r13 = r9 + WORD_SIZE*4
  775. set_mem r13, r5 :: builtins.object*
  776. r14 = r9 + WORD_SIZE*5
  777. set_mem r14, r6 :: builtins.object*
  778. r15 = r9 + WORD_SIZE*6
  779. set_mem r15, r7 :: builtins.object*
  780. keep_alive r0
  781. l = r0
  782. r16 = object 1
  783. r17 = PyObject_DelItem(l, r16)
  784. r18 = r17 >= 0 :: signed
  785. r19 = object 2
  786. r20 = PyObject_DelItem(l, r19)
  787. r21 = r20 >= 0 :: signed
  788. r22 = object 3
  789. r23 = PyObject_DelItem(l, r22)
  790. r24 = r23 >= 0 :: signed
  791. return 1
  792. [case testDelDict]
  793. def delDict() -> None:
  794. d = {"one":1, "two":2}
  795. del d["one"]
  796. def delDictMultiple() -> None:
  797. d = {"one":1, "two":2, "three":3, "four":4}
  798. del d["one"], d["four"]
  799. [out]
  800. def delDict():
  801. r0, r1 :: str
  802. r2, r3 :: object
  803. r4, d :: dict
  804. r5 :: str
  805. r6 :: int32
  806. r7 :: bit
  807. L0:
  808. r0 = 'one'
  809. r1 = 'two'
  810. r2 = object 1
  811. r3 = object 2
  812. r4 = CPyDict_Build(2, r0, r2, r1, r3)
  813. d = r4
  814. r5 = 'one'
  815. r6 = PyObject_DelItem(d, r5)
  816. r7 = r6 >= 0 :: signed
  817. return 1
  818. def delDictMultiple():
  819. r0, r1, r2, r3 :: str
  820. r4, r5, r6, r7 :: object
  821. r8, d :: dict
  822. r9, r10 :: str
  823. r11 :: int32
  824. r12 :: bit
  825. r13 :: int32
  826. r14 :: bit
  827. L0:
  828. r0 = 'one'
  829. r1 = 'two'
  830. r2 = 'three'
  831. r3 = 'four'
  832. r4 = object 1
  833. r5 = object 2
  834. r6 = object 3
  835. r7 = object 4
  836. r8 = CPyDict_Build(4, r0, r4, r1, r5, r2, r6, r3, r7)
  837. d = r8
  838. r9 = 'one'
  839. r10 = 'four'
  840. r11 = PyObject_DelItem(d, r9)
  841. r12 = r11 >= 0 :: signed
  842. r13 = PyObject_DelItem(d, r10)
  843. r14 = r13 >= 0 :: signed
  844. return 1
  845. [case testDelAttribute]
  846. class Dummy():
  847. __deletable__ = ('x', 'y')
  848. def __init__(self, x: int, y: int) -> None:
  849. self.x = x
  850. self.y = y
  851. def delAttribute() -> None:
  852. dummy = Dummy(1, 2)
  853. del dummy.x
  854. def delAttributeMultiple() -> None:
  855. dummy = Dummy(1, 2)
  856. del dummy.x, dummy.y
  857. [out]
  858. def Dummy.__init__(self, x, y):
  859. self :: __main__.Dummy
  860. x, y :: int
  861. L0:
  862. self.x = x
  863. self.y = y
  864. return 1
  865. def delAttribute():
  866. r0, dummy :: __main__.Dummy
  867. r1 :: str
  868. r2 :: int32
  869. r3 :: bit
  870. L0:
  871. r0 = Dummy(2, 4)
  872. dummy = r0
  873. r1 = 'x'
  874. r2 = PyObject_DelAttr(dummy, r1)
  875. r3 = r2 >= 0 :: signed
  876. return 1
  877. def delAttributeMultiple():
  878. r0, dummy :: __main__.Dummy
  879. r1 :: str
  880. r2 :: int32
  881. r3 :: bit
  882. r4 :: str
  883. r5 :: int32
  884. r6 :: bit
  885. L0:
  886. r0 = Dummy(2, 4)
  887. dummy = r0
  888. r1 = 'x'
  889. r2 = PyObject_DelAttr(dummy, r1)
  890. r3 = r2 >= 0 :: signed
  891. r4 = 'y'
  892. r5 = PyObject_DelAttr(dummy, r4)
  893. r6 = r5 >= 0 :: signed
  894. return 1
  895. [case testForEnumerate]
  896. from typing import List, Iterable
  897. def f(a: List[int]) -> None:
  898. for i, x in enumerate(a):
  899. i + x
  900. def g(x: Iterable[int]) -> None:
  901. for i, n in enumerate(x):
  902. pass
  903. [out]
  904. def f(a):
  905. a :: list
  906. r0 :: short_int
  907. i :: int
  908. r1 :: short_int
  909. r2 :: ptr
  910. r3 :: native_int
  911. r4 :: short_int
  912. r5 :: bit
  913. r6 :: object
  914. r7, x, r8 :: int
  915. r9, r10 :: short_int
  916. L0:
  917. r0 = 0
  918. i = 0
  919. r1 = 0
  920. L1:
  921. r2 = get_element_ptr a ob_size :: PyVarObject
  922. r3 = load_mem r2 :: native_int*
  923. keep_alive a
  924. r4 = r3 << 1
  925. r5 = r1 < r4 :: signed
  926. if r5 goto L2 else goto L4 :: bool
  927. L2:
  928. r6 = CPyList_GetItemUnsafe(a, r1)
  929. r7 = unbox(int, r6)
  930. x = r7
  931. r8 = CPyTagged_Add(i, x)
  932. L3:
  933. r9 = r0 + 2
  934. r0 = r9
  935. i = r9
  936. r10 = r1 + 2
  937. r1 = r10
  938. goto L1
  939. L4:
  940. L5:
  941. return 1
  942. def g(x):
  943. x :: object
  944. r0 :: short_int
  945. i :: int
  946. r1, r2 :: object
  947. r3, n :: int
  948. r4 :: short_int
  949. r5 :: bit
  950. L0:
  951. r0 = 0
  952. i = 0
  953. r1 = PyObject_GetIter(x)
  954. L1:
  955. r2 = PyIter_Next(r1)
  956. if is_error(r2) goto L4 else goto L2
  957. L2:
  958. r3 = unbox(int, r2)
  959. n = r3
  960. L3:
  961. r4 = r0 + 2
  962. r0 = r4
  963. i = r4
  964. goto L1
  965. L4:
  966. r5 = CPy_NoErrOccured()
  967. L5:
  968. return 1
  969. [case testForZip]
  970. from typing import List, Iterable, Sequence
  971. def f(a: List[int], b: Sequence[bool]) -> None:
  972. for x, y in zip(a, b):
  973. if b:
  974. x = 1
  975. def g(a: Iterable[bool], b: List[int]) -> None:
  976. for x, y, z in zip(a, b, range(5)):
  977. x = False
  978. [out]
  979. def f(a, b):
  980. a :: list
  981. b :: object
  982. r0 :: short_int
  983. r1 :: object
  984. r2 :: ptr
  985. r3 :: native_int
  986. r4 :: short_int
  987. r5 :: bit
  988. r6, r7 :: object
  989. r8, x :: int
  990. r9, y :: bool
  991. r10 :: int32
  992. r11 :: bit
  993. r12 :: bool
  994. r13 :: short_int
  995. r14 :: bit
  996. L0:
  997. r0 = 0
  998. r1 = PyObject_GetIter(b)
  999. L1:
  1000. r2 = get_element_ptr a ob_size :: PyVarObject
  1001. r3 = load_mem r2 :: native_int*
  1002. keep_alive a
  1003. r4 = r3 << 1
  1004. r5 = r0 < r4 :: signed
  1005. if r5 goto L2 else goto L7 :: bool
  1006. L2:
  1007. r6 = PyIter_Next(r1)
  1008. if is_error(r6) goto L7 else goto L3
  1009. L3:
  1010. r7 = CPyList_GetItemUnsafe(a, r0)
  1011. r8 = unbox(int, r7)
  1012. x = r8
  1013. r9 = unbox(bool, r6)
  1014. y = r9
  1015. r10 = PyObject_IsTrue(b)
  1016. r11 = r10 >= 0 :: signed
  1017. r12 = truncate r10: int32 to builtins.bool
  1018. if r12 goto L4 else goto L5 :: bool
  1019. L4:
  1020. x = 2
  1021. L5:
  1022. L6:
  1023. r13 = r0 + 2
  1024. r0 = r13
  1025. goto L1
  1026. L7:
  1027. r14 = CPy_NoErrOccured()
  1028. L8:
  1029. return 1
  1030. def g(a, b):
  1031. a :: object
  1032. b :: list
  1033. r0 :: object
  1034. r1, r2 :: short_int
  1035. z :: int
  1036. r3 :: object
  1037. r4 :: ptr
  1038. r5 :: native_int
  1039. r6 :: short_int
  1040. r7, r8 :: bit
  1041. r9, x :: bool
  1042. r10 :: object
  1043. r11, y :: int
  1044. r12, r13 :: short_int
  1045. r14 :: bit
  1046. L0:
  1047. r0 = PyObject_GetIter(a)
  1048. r1 = 0
  1049. r2 = 0
  1050. z = r2
  1051. L1:
  1052. r3 = PyIter_Next(r0)
  1053. if is_error(r3) goto L6 else goto L2
  1054. L2:
  1055. r4 = get_element_ptr b ob_size :: PyVarObject
  1056. r5 = load_mem r4 :: native_int*
  1057. keep_alive b
  1058. r6 = r5 << 1
  1059. r7 = r1 < r6 :: signed
  1060. if r7 goto L3 else goto L6 :: bool
  1061. L3:
  1062. r8 = r2 < 10 :: signed
  1063. if r8 goto L4 else goto L6 :: bool
  1064. L4:
  1065. r9 = unbox(bool, r3)
  1066. x = r9
  1067. r10 = CPyList_GetItemUnsafe(b, r1)
  1068. r11 = unbox(int, r10)
  1069. y = r11
  1070. x = 0
  1071. L5:
  1072. r12 = r1 + 2
  1073. r1 = r12
  1074. r13 = r2 + 2
  1075. r2 = r13
  1076. z = r13
  1077. goto L1
  1078. L6:
  1079. r14 = CPy_NoErrOccured()
  1080. L7:
  1081. return 1