refcount.test 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528
  1. -- Test cases for reference count insertion.
  2. [case testReturnLiteral]
  3. def f() -> int:
  4. return 1
  5. [out]
  6. def f():
  7. L0:
  8. return 2
  9. [case testReturnLocal]
  10. def f() -> int:
  11. x = 1
  12. return x
  13. [out]
  14. def f():
  15. x :: int
  16. L0:
  17. x = 2
  18. return x
  19. [case testLocalVars]
  20. def f() -> int:
  21. x = 1
  22. y = x
  23. x = y
  24. return x
  25. [out]
  26. def f():
  27. x, y :: int
  28. L0:
  29. x = 2
  30. y = x
  31. x = y
  32. return x
  33. [case testLocalVars2]
  34. def f() -> int:
  35. x = 1
  36. y = x
  37. z = x
  38. return y + z
  39. [out]
  40. def f():
  41. x, y, z, r0 :: int
  42. L0:
  43. x = 2
  44. inc_ref x :: int
  45. y = x
  46. z = x
  47. r0 = CPyTagged_Add(y, z)
  48. dec_ref y :: int
  49. dec_ref z :: int
  50. return r0
  51. [case testFreeAtReturn]
  52. def f() -> int:
  53. x = 1
  54. y = 2
  55. if x == 1:
  56. return x
  57. return y
  58. [out]
  59. def f():
  60. x, y :: int
  61. r0 :: bit
  62. L0:
  63. x = 2
  64. y = 4
  65. r0 = x == 2
  66. if r0 goto L3 else goto L4 :: bool
  67. L1:
  68. return x
  69. L2:
  70. return y
  71. L3:
  72. dec_ref y :: int
  73. goto L1
  74. L4:
  75. dec_ref x :: int
  76. goto L2
  77. [case testArgumentsInOps]
  78. def f(a: int, b: int) -> int:
  79. x = a + 1
  80. y = x + a
  81. return y
  82. [out]
  83. def f(a, b):
  84. a, b, r0, x, r1, y :: int
  85. L0:
  86. r0 = CPyTagged_Add(a, 2)
  87. x = r0
  88. r1 = CPyTagged_Add(x, a)
  89. dec_ref x :: int
  90. y = r1
  91. return y
  92. [case testArgumentsInAssign]
  93. def f(a: int) -> int:
  94. x = a
  95. y = a
  96. x = 1
  97. return x + y
  98. [out]
  99. def f(a):
  100. a, x, y, r0 :: int
  101. L0:
  102. inc_ref a :: int
  103. x = a
  104. dec_ref x :: int
  105. inc_ref a :: int
  106. y = a
  107. x = 2
  108. r0 = CPyTagged_Add(x, y)
  109. dec_ref x :: int
  110. dec_ref y :: int
  111. return r0
  112. [case testAssignToArgument1]
  113. def f(a: int) -> int:
  114. a = 1
  115. y = a
  116. return y
  117. [out]
  118. def f(a):
  119. a, y :: int
  120. L0:
  121. a = 2
  122. y = a
  123. return y
  124. [case testAssignToArgument2]
  125. def f(a: int) -> int:
  126. a = 1
  127. a = 2
  128. a = 3
  129. return a
  130. [out]
  131. def f(a):
  132. a :: int
  133. L0:
  134. a = 2
  135. dec_ref a :: int
  136. a = 4
  137. dec_ref a :: int
  138. a = 6
  139. return a
  140. [case testAssignToArgument3]
  141. def f(a: int) -> int:
  142. x = 1
  143. a = x
  144. y = x
  145. return a
  146. [out]
  147. def f(a):
  148. a, x, y :: int
  149. L0:
  150. x = 2
  151. inc_ref x :: int
  152. a = x
  153. y = x
  154. dec_ref y :: int
  155. return a
  156. [case testReturnArgument]
  157. def f(a: int) -> int:
  158. return a
  159. [out]
  160. def f(a):
  161. a :: int
  162. L0:
  163. inc_ref a :: int
  164. return a
  165. [case testConditionalAssignToArgument1]
  166. def f(a: int) -> int:
  167. if a == a:
  168. a = 1
  169. else:
  170. x = 2
  171. y = a + 1
  172. return y
  173. [out]
  174. def f(a):
  175. a :: int
  176. r0 :: native_int
  177. r1, r2, r3 :: bit
  178. x, r4, y :: int
  179. L0:
  180. r0 = a & 1
  181. r1 = r0 != 0
  182. if r1 goto L1 else goto L2 :: bool
  183. L1:
  184. r2 = CPyTagged_IsEq_(a, a)
  185. if r2 goto L3 else goto L4 :: bool
  186. L2:
  187. r3 = a == a
  188. if r3 goto L3 else goto L4 :: bool
  189. L3:
  190. a = 2
  191. goto L5
  192. L4:
  193. x = 4
  194. dec_ref x :: int
  195. goto L6
  196. L5:
  197. r4 = CPyTagged_Add(a, 2)
  198. dec_ref a :: int
  199. y = r4
  200. return y
  201. L6:
  202. inc_ref a :: int
  203. goto L5
  204. [case testConditionalAssignToArgument2]
  205. def f(a: int) -> int:
  206. if a == a:
  207. x = 2
  208. else:
  209. a = 1
  210. y = a + 1
  211. return y
  212. [out]
  213. def f(a):
  214. a :: int
  215. r0 :: native_int
  216. r1, r2, r3 :: bit
  217. x, r4, y :: int
  218. L0:
  219. r0 = a & 1
  220. r1 = r0 != 0
  221. if r1 goto L1 else goto L2 :: bool
  222. L1:
  223. r2 = CPyTagged_IsEq_(a, a)
  224. if r2 goto L3 else goto L4 :: bool
  225. L2:
  226. r3 = a == a
  227. if r3 goto L3 else goto L4 :: bool
  228. L3:
  229. x = 4
  230. dec_ref x :: int
  231. goto L6
  232. L4:
  233. a = 2
  234. L5:
  235. r4 = CPyTagged_Add(a, 2)
  236. dec_ref a :: int
  237. y = r4
  238. return y
  239. L6:
  240. inc_ref a :: int
  241. goto L5
  242. [case testConditionalAssignToArgument3]
  243. def f(a: int) -> int:
  244. if a == a:
  245. a = 1
  246. return a
  247. [out]
  248. def f(a):
  249. a :: int
  250. r0 :: native_int
  251. r1, r2, r3 :: bit
  252. L0:
  253. r0 = a & 1
  254. r1 = r0 != 0
  255. if r1 goto L1 else goto L2 :: bool
  256. L1:
  257. r2 = CPyTagged_IsEq_(a, a)
  258. if r2 goto L3 else goto L5 :: bool
  259. L2:
  260. r3 = a == a
  261. if r3 goto L3 else goto L5 :: bool
  262. L3:
  263. a = 2
  264. L4:
  265. return a
  266. L5:
  267. inc_ref a :: int
  268. goto L4
  269. [case testAssignRegisterToItself]
  270. def f(a: int) -> int:
  271. a = a
  272. x = 1
  273. x = x
  274. return x + a
  275. -- This is correct but bad code
  276. [out]
  277. def f(a):
  278. a, x, r0 :: int
  279. L0:
  280. inc_ref a :: int
  281. a = a
  282. x = 2
  283. inc_ref x :: int
  284. dec_ref x :: int
  285. x = x
  286. r0 = CPyTagged_Add(x, a)
  287. dec_ref x :: int
  288. dec_ref a :: int
  289. return r0
  290. [case testIncrement1]
  291. def f(a: int) -> int:
  292. a = a + 1
  293. x = 1
  294. x = x + 1
  295. return a + x
  296. [out]
  297. def f(a):
  298. a, r0, x, r1, r2 :: int
  299. L0:
  300. r0 = CPyTagged_Add(a, 2)
  301. a = r0
  302. x = 2
  303. r1 = CPyTagged_Add(x, 2)
  304. dec_ref x :: int
  305. x = r1
  306. r2 = CPyTagged_Add(a, x)
  307. dec_ref a :: int
  308. dec_ref x :: int
  309. return r2
  310. [case testIncrement2]
  311. def f() -> None:
  312. x = 1
  313. x = x + 1
  314. [out]
  315. def f():
  316. x, r0 :: int
  317. L0:
  318. x = 2
  319. r0 = CPyTagged_Add(x, 2)
  320. dec_ref x :: int
  321. x = r0
  322. dec_ref x :: int
  323. return 1
  324. [case testAdd1]
  325. def f() -> None:
  326. y = 1
  327. x = y + 1
  328. [out]
  329. def f():
  330. y, r0, x :: int
  331. L0:
  332. y = 2
  333. r0 = CPyTagged_Add(y, 2)
  334. dec_ref y :: int
  335. x = r0
  336. dec_ref x :: int
  337. return 1
  338. [case testAdd2]
  339. def f(a: int) -> int:
  340. a = a + a
  341. x = a
  342. x = x + x
  343. return x
  344. [out]
  345. def f(a):
  346. a, r0, x, r1 :: int
  347. L0:
  348. r0 = CPyTagged_Add(a, a)
  349. a = r0
  350. x = a
  351. r1 = CPyTagged_Add(x, x)
  352. dec_ref x :: int
  353. x = r1
  354. return x
  355. [case testAdd3]
  356. def f(a: int) -> int:
  357. x = a + a
  358. y = x + x
  359. return y
  360. [out]
  361. def f(a):
  362. a, r0, x, r1, y :: int
  363. L0:
  364. r0 = CPyTagged_Add(a, a)
  365. x = r0
  366. r1 = CPyTagged_Add(x, x)
  367. dec_ref x :: int
  368. y = r1
  369. return y
  370. [case testAdd4]
  371. def f(a: int) -> None:
  372. x = a + a
  373. y = 1
  374. z = y + y
  375. [out]
  376. def f(a):
  377. a, r0, x, y, r1, z :: int
  378. L0:
  379. r0 = CPyTagged_Add(a, a)
  380. x = r0
  381. dec_ref x :: int
  382. y = 2
  383. r1 = CPyTagged_Add(y, y)
  384. dec_ref y :: int
  385. z = r1
  386. dec_ref z :: int
  387. return 1
  388. [case testAdd5]
  389. def f(a: int) -> None:
  390. a = a + a
  391. x = 1
  392. x = x + x
  393. [out]
  394. def f(a):
  395. a, r0, x, r1 :: int
  396. L0:
  397. r0 = CPyTagged_Add(a, a)
  398. a = r0
  399. dec_ref a :: int
  400. x = 2
  401. r1 = CPyTagged_Add(x, x)
  402. dec_ref x :: int
  403. x = r1
  404. dec_ref x :: int
  405. return 1
  406. [case testReturnInMiddleOfFunction]
  407. def f() -> int:
  408. x = 1
  409. y = 2
  410. z = 3
  411. if z == z:
  412. return z
  413. a = 1
  414. return x + y - a
  415. [out]
  416. def f():
  417. x, y, z :: int
  418. r0 :: native_int
  419. r1, r2, r3 :: bit
  420. a, r4, r5 :: int
  421. L0:
  422. x = 2
  423. y = 4
  424. z = 6
  425. r0 = z & 1
  426. r1 = r0 != 0
  427. if r1 goto L1 else goto L2 :: bool
  428. L1:
  429. r2 = CPyTagged_IsEq_(z, z)
  430. if r2 goto L5 else goto L6 :: bool
  431. L2:
  432. r3 = z == z
  433. if r3 goto L5 else goto L6 :: bool
  434. L3:
  435. return z
  436. L4:
  437. a = 2
  438. r4 = CPyTagged_Add(x, y)
  439. dec_ref x :: int
  440. dec_ref y :: int
  441. r5 = CPyTagged_Subtract(r4, a)
  442. dec_ref r4 :: int
  443. dec_ref a :: int
  444. return r5
  445. L5:
  446. dec_ref x :: int
  447. dec_ref y :: int
  448. goto L3
  449. L6:
  450. dec_ref z :: int
  451. goto L4
  452. [case testLoop]
  453. def f(a: int) -> int:
  454. sum = 0
  455. i = 0
  456. while i <= a:
  457. sum = sum + i
  458. i = i + 1
  459. return sum
  460. [out]
  461. def f(a):
  462. a, sum, i :: int
  463. r0 :: native_int
  464. r1 :: bit
  465. r2 :: native_int
  466. r3, r4, r5 :: bit
  467. r6, r7 :: int
  468. L0:
  469. sum = 0
  470. i = 0
  471. L1:
  472. r0 = i & 1
  473. r1 = r0 != 0
  474. if r1 goto L3 else goto L2 :: bool
  475. L2:
  476. r2 = a & 1
  477. r3 = r2 != 0
  478. if r3 goto L3 else goto L4 :: bool
  479. L3:
  480. r4 = CPyTagged_IsLt_(a, i)
  481. if r4 goto L7 else goto L5 :: bool
  482. L4:
  483. r5 = i <= a :: signed
  484. if r5 goto L5 else goto L7 :: bool
  485. L5:
  486. r6 = CPyTagged_Add(sum, i)
  487. dec_ref sum :: int
  488. sum = r6
  489. r7 = CPyTagged_Add(i, 2)
  490. dec_ref i :: int
  491. i = r7
  492. goto L1
  493. L6:
  494. return sum
  495. L7:
  496. dec_ref i :: int
  497. goto L6
  498. [case testCall]
  499. def f(a: int) -> int:
  500. return f(a + 1)
  501. [out]
  502. def f(a):
  503. a, r0, r1 :: int
  504. L0:
  505. r0 = CPyTagged_Add(a, 2)
  506. r1 = f(r0)
  507. dec_ref r0 :: int
  508. return r1
  509. [case testError]
  510. def f(x: List[int]) -> None: pass # E: Name "List" is not defined \
  511. # N: Did you forget to import it from "typing"? (Suggestion: "from typing import List")
  512. [case testNewList]
  513. def f() -> int:
  514. a = [0, 1]
  515. return 0
  516. [out]
  517. def f():
  518. r0 :: list
  519. r1, r2 :: object
  520. r3, r4, r5 :: ptr
  521. a :: list
  522. L0:
  523. r0 = PyList_New(2)
  524. r1 = object 0
  525. r2 = object 1
  526. r3 = get_element_ptr r0 ob_item :: PyListObject
  527. r4 = load_mem r3 :: ptr*
  528. inc_ref r1
  529. set_mem r4, r1 :: builtins.object*
  530. r5 = r4 + WORD_SIZE*1
  531. inc_ref r2
  532. set_mem r5, r2 :: builtins.object*
  533. a = r0
  534. dec_ref a
  535. return 0
  536. [case testListSet]
  537. from typing import List
  538. def f(a: List[int], b: List[int]) -> None:
  539. a[0] = b[0]
  540. [out]
  541. def f(a, b):
  542. a, b :: list
  543. r0 :: object
  544. r1 :: int
  545. r2 :: object
  546. r3 :: bit
  547. L0:
  548. r0 = CPyList_GetItemShort(b, 0)
  549. r1 = unbox(int, r0)
  550. dec_ref r0
  551. r2 = box(int, r1)
  552. r3 = CPyList_SetItem(a, 0, r2)
  553. return 1
  554. [case testTupleRefcount]
  555. from typing import Tuple
  556. def f(x: Tuple[Tuple[int, bool], bool]) -> int:
  557. return x[0][0]
  558. [out]
  559. def f(x):
  560. x :: tuple[tuple[int, bool], bool]
  561. r0 :: tuple[int, bool]
  562. r1 :: int
  563. L0:
  564. r0 = x[0]
  565. r1 = r0[0]
  566. dec_ref r0
  567. return r1
  568. [case testUserClassRefCount]
  569. class C:
  570. x: 'C'
  571. def f() -> None:
  572. c = C()
  573. c.x = C()
  574. [out]
  575. def f():
  576. r0, c, r1 :: __main__.C
  577. r2 :: bool
  578. L0:
  579. r0 = C()
  580. c = r0
  581. r1 = C()
  582. c.x = r1; r2 = is_error
  583. dec_ref c
  584. return 1
  585. [case testCastRefCount]
  586. class C: pass
  587. def f() -> None:
  588. a = [C()]
  589. d = a[0]
  590. [out]
  591. def f():
  592. r0 :: __main__.C
  593. r1 :: list
  594. r2, r3 :: ptr
  595. a :: list
  596. r4 :: object
  597. r5, d :: __main__.C
  598. L0:
  599. r0 = C()
  600. r1 = PyList_New(1)
  601. r2 = get_element_ptr r1 ob_item :: PyListObject
  602. r3 = load_mem r2 :: ptr*
  603. set_mem r3, r0 :: builtins.object*
  604. a = r1
  605. r4 = CPyList_GetItemShort(a, 0)
  606. dec_ref a
  607. r5 = cast(__main__.C, r4)
  608. d = r5
  609. dec_ref d
  610. return 1
  611. [case testUnaryBranchSpecialCase]
  612. def f(x: bool) -> int:
  613. if x:
  614. return 1
  615. return 2
  616. [out]
  617. def f(x):
  618. x :: bool
  619. L0:
  620. if x goto L1 else goto L2 :: bool
  621. L1:
  622. return 2
  623. L2:
  624. return 4
  625. [case testUnicodeLiteral]
  626. def f() -> str:
  627. return "some string"
  628. [out]
  629. def f():
  630. r0 :: str
  631. L0:
  632. r0 = 'some string'
  633. inc_ref r0
  634. return r0
  635. [case testPyMethodCall]
  636. def g(x: str) -> int:
  637. return int(x, base=2)
  638. [out]
  639. def g(x):
  640. x :: str
  641. r0 :: object
  642. r1 :: str
  643. r2 :: tuple
  644. r3 :: object
  645. r4 :: dict
  646. r5 :: object
  647. r6 :: int
  648. L0:
  649. r0 = load_address PyLong_Type
  650. r1 = 'base'
  651. r2 = PyTuple_Pack(1, x)
  652. r3 = object 2
  653. r4 = CPyDict_Build(1, r1, r3)
  654. r5 = PyObject_Call(r0, r2, r4)
  655. dec_ref r2
  656. dec_ref r4
  657. r6 = unbox(int, r5)
  658. dec_ref r5
  659. return r6
  660. [case testListAppend]
  661. from typing import List
  662. def f(a: List[int], x: int) -> None:
  663. a.append(x)
  664. [out]
  665. def f(a, x):
  666. a :: list
  667. x :: int
  668. r0 :: object
  669. r1 :: int32
  670. r2 :: bit
  671. L0:
  672. inc_ref x :: int
  673. r0 = box(int, x)
  674. r1 = PyList_Append(a, r0)
  675. dec_ref r0
  676. r2 = r1 >= 0 :: signed
  677. return 1
  678. [case testForDict]
  679. from typing import Dict
  680. def f(d: Dict[int, int]) -> None:
  681. for key in d:
  682. d[key]
  683. [out]
  684. def f(d):
  685. d :: dict
  686. r0 :: short_int
  687. r1 :: native_int
  688. r2 :: short_int
  689. r3 :: object
  690. r4 :: tuple[bool, short_int, object]
  691. r5 :: short_int
  692. r6 :: bool
  693. r7 :: object
  694. r8, key :: int
  695. r9, r10 :: object
  696. r11 :: int
  697. r12, r13 :: bit
  698. L0:
  699. r0 = 0
  700. r1 = PyDict_Size(d)
  701. r2 = r1 << 1
  702. r3 = CPyDict_GetKeysIter(d)
  703. L1:
  704. r4 = CPyDict_NextKey(r3, r0)
  705. r5 = r4[1]
  706. r0 = r5
  707. r6 = r4[0]
  708. if r6 goto L2 else goto L6 :: bool
  709. L2:
  710. r7 = r4[2]
  711. dec_ref r4
  712. r8 = unbox(int, r7)
  713. dec_ref r7
  714. key = r8
  715. r9 = box(int, key)
  716. r10 = CPyDict_GetItem(d, r9)
  717. dec_ref r9
  718. r11 = unbox(int, r10)
  719. dec_ref r10
  720. dec_ref r11 :: int
  721. L3:
  722. r12 = CPyDict_CheckSize(d, r2)
  723. goto L1
  724. L4:
  725. r13 = CPy_NoErrOccured()
  726. L5:
  727. return 1
  728. L6:
  729. dec_ref r3
  730. dec_ref r4
  731. goto L4
  732. [case testBorrowRefs]
  733. def make_garbage(arg: object) -> None:
  734. b = True
  735. while b:
  736. arg = None
  737. b = False
  738. [out]
  739. def make_garbage(arg):
  740. arg :: object
  741. b :: bool
  742. r0 :: object
  743. L0:
  744. b = 1
  745. L1:
  746. if b goto L2 else goto L3 :: bool
  747. L2:
  748. r0 = box(None, 1)
  749. inc_ref r0
  750. arg = r0
  751. dec_ref arg
  752. b = 0
  753. goto L1
  754. L3:
  755. return 1
  756. [case testGetElementPtrLifeTime]
  757. from typing import List
  758. def f() -> int:
  759. x: List[str] = []
  760. return len(x)
  761. [out]
  762. def f():
  763. r0, x :: list
  764. r1 :: ptr
  765. r2 :: native_int
  766. r3 :: short_int
  767. L0:
  768. r0 = PyList_New(0)
  769. x = r0
  770. r1 = get_element_ptr x ob_size :: PyVarObject
  771. r2 = load_mem r1 :: native_int*
  772. dec_ref x
  773. r3 = r2 << 1
  774. return r3
  775. [case testSometimesUninitializedVariable]
  776. def f(x: bool) -> int:
  777. if x:
  778. y = 1
  779. else:
  780. z = 2
  781. return y + z
  782. [out]
  783. def f(x):
  784. x :: bool
  785. r0, y, r1, z :: int
  786. r2, r3 :: bool
  787. r4 :: int
  788. L0:
  789. r0 = <error> :: int
  790. y = r0
  791. r1 = <error> :: int
  792. z = r1
  793. if x goto L8 else goto L9 :: bool
  794. L1:
  795. y = 2
  796. goto L3
  797. L2:
  798. z = 4
  799. L3:
  800. if is_error(y) goto L10 else goto L5
  801. L4:
  802. r2 = raise UnboundLocalError('local variable "y" referenced before assignment')
  803. unreachable
  804. L5:
  805. if is_error(z) goto L11 else goto L7
  806. L6:
  807. r3 = raise UnboundLocalError('local variable "z" referenced before assignment')
  808. unreachable
  809. L7:
  810. r4 = CPyTagged_Add(y, z)
  811. xdec_ref y :: int
  812. xdec_ref z :: int
  813. return r4
  814. L8:
  815. xdec_ref y :: int
  816. goto L1
  817. L9:
  818. xdec_ref z :: int
  819. goto L2
  820. L10:
  821. xdec_ref z :: int
  822. goto L4
  823. L11:
  824. xdec_ref y :: int
  825. goto L6
  826. [case testVectorcall_python3_8]
  827. from typing import Any
  828. def call(f: Any, x: int) -> int:
  829. return f(x)
  830. [out]
  831. def call(f, x):
  832. f :: object
  833. x :: int
  834. r0 :: object
  835. r1 :: object[1]
  836. r2 :: object_ptr
  837. r3 :: object
  838. r4 :: int
  839. L0:
  840. inc_ref x :: int
  841. r0 = box(int, x)
  842. r1 = [r0]
  843. r2 = load_address r1
  844. r3 = _PyObject_Vectorcall(f, r2, 1, 0)
  845. dec_ref r0
  846. r4 = unbox(int, r3)
  847. dec_ref r3
  848. return r4
  849. [case testVectorcallMethod_python3_9_64bit]
  850. from typing import Any
  851. def call(o: Any, x: int) -> int:
  852. return o.m(x)
  853. [out]
  854. def call(o, x):
  855. o :: object
  856. x :: int
  857. r0 :: str
  858. r1 :: object
  859. r2 :: object[2]
  860. r3 :: object_ptr
  861. r4 :: object
  862. r5 :: int
  863. L0:
  864. r0 = 'm'
  865. inc_ref x :: int
  866. r1 = box(int, x)
  867. r2 = [o, r1]
  868. r3 = load_address r2
  869. r4 = PyObject_VectorcallMethod(r0, r3, 9223372036854775810, 0)
  870. dec_ref r1
  871. r5 = unbox(int, r4)
  872. dec_ref r4
  873. return r5
  874. [case testBorrowAttribute]
  875. def g() -> int:
  876. d = D()
  877. return d.c.x
  878. def f(d: D) -> int:
  879. return d.c.x
  880. class C:
  881. x: int
  882. class D:
  883. c: C
  884. [out]
  885. def g():
  886. r0, d :: __main__.D
  887. r1 :: __main__.C
  888. r2 :: int
  889. L0:
  890. r0 = D()
  891. d = r0
  892. r1 = borrow d.c
  893. r2 = r1.x
  894. dec_ref d
  895. return r2
  896. def f(d):
  897. d :: __main__.D
  898. r0 :: __main__.C
  899. r1 :: int
  900. L0:
  901. r0 = borrow d.c
  902. r1 = r0.x
  903. return r1
  904. [case testBorrowAttributeTwice]
  905. def f(e: E) -> int:
  906. return e.d.c.x
  907. class C:
  908. x: int
  909. class D:
  910. c: C
  911. class E:
  912. d: D
  913. [out]
  914. def f(e):
  915. e :: __main__.E
  916. r0 :: __main__.D
  917. r1 :: __main__.C
  918. r2 :: int
  919. L0:
  920. r0 = borrow e.d
  921. r1 = borrow r0.c
  922. r2 = r1.x
  923. return r2
  924. [case testBorrowAttributeIsNone]
  925. from typing import Optional
  926. def f(c: C) -> bool:
  927. return c.x is not None
  928. def g(c: C) -> bool:
  929. return c.x is None
  930. class C:
  931. x: Optional[str]
  932. [out]
  933. def f(c):
  934. c :: __main__.C
  935. r0 :: union[str, None]
  936. r1 :: object
  937. r2 :: bit
  938. L0:
  939. r0 = borrow c.x
  940. r1 = load_address _Py_NoneStruct
  941. r2 = r0 != r1
  942. return r2
  943. def g(c):
  944. c :: __main__.C
  945. r0 :: union[str, None]
  946. r1 :: object
  947. r2 :: bit
  948. L0:
  949. r0 = borrow c.x
  950. r1 = load_address _Py_NoneStruct
  951. r2 = r0 == r1
  952. return r2
  953. [case testBorrowAttributeNarrowOptional]
  954. from typing import Optional
  955. def f(c: C) -> bool:
  956. if c.x is not None:
  957. return c.x.b
  958. return False
  959. class C:
  960. x: Optional[D]
  961. class D:
  962. b: bool
  963. [out]
  964. def f(c):
  965. c :: __main__.C
  966. r0 :: union[__main__.D, None]
  967. r1 :: object
  968. r2 :: bit
  969. r3 :: union[__main__.D, None]
  970. r4 :: __main__.D
  971. r5 :: bool
  972. L0:
  973. r0 = borrow c.x
  974. r1 = load_address _Py_NoneStruct
  975. r2 = r0 != r1
  976. if r2 goto L1 else goto L2 :: bool
  977. L1:
  978. r3 = borrow c.x
  979. r4 = borrow cast(__main__.D, r3)
  980. r5 = r4.b
  981. return r5
  982. L2:
  983. return 0
  984. [case testBorrowLenArgument]
  985. from typing import List
  986. def f(x: C) -> int:
  987. return len(x.a)
  988. class C:
  989. a: List[str]
  990. [out]
  991. def f(x):
  992. x :: __main__.C
  993. r0 :: list
  994. r1 :: ptr
  995. r2 :: native_int
  996. r3 :: short_int
  997. L0:
  998. r0 = borrow x.a
  999. r1 = get_element_ptr r0 ob_size :: PyVarObject
  1000. r2 = load_mem r1 :: native_int*
  1001. r3 = r2 << 1
  1002. return r3
  1003. [case testBorrowIsinstanceArgument]
  1004. from typing import List
  1005. def f(x: C) -> bool:
  1006. if isinstance(x.a, D):
  1007. return x.a.b
  1008. else:
  1009. return True
  1010. class C:
  1011. a: object
  1012. class D:
  1013. b: bool
  1014. [out]
  1015. def f(x):
  1016. x :: __main__.C
  1017. r0, r1 :: object
  1018. r2 :: ptr
  1019. r3 :: object
  1020. r4 :: bit
  1021. r5 :: object
  1022. r6 :: __main__.D
  1023. r7 :: bool
  1024. L0:
  1025. r0 = borrow x.a
  1026. r1 = __main__.D :: type
  1027. r2 = get_element_ptr r0 ob_type :: PyObject
  1028. r3 = load_mem r2 :: builtins.object*
  1029. r4 = r3 == r1
  1030. if r4 goto L1 else goto L2 :: bool
  1031. L1:
  1032. r5 = borrow x.a
  1033. r6 = borrow cast(__main__.D, r5)
  1034. r7 = r6.b
  1035. return r7
  1036. L2:
  1037. return 1
  1038. [case testBorrowListGetItem1]
  1039. from typing import List
  1040. def literal_index(x: C) -> str:
  1041. return x.a[0]
  1042. def negative_index(x: C) -> str:
  1043. return x.a[-1]
  1044. def lvar_index(x: C, n: int) -> str:
  1045. return x.a[n]
  1046. class C:
  1047. a: List[str]
  1048. [out]
  1049. def literal_index(x):
  1050. x :: __main__.C
  1051. r0 :: list
  1052. r1 :: object
  1053. r2 :: str
  1054. L0:
  1055. r0 = borrow x.a
  1056. r1 = CPyList_GetItemShort(r0, 0)
  1057. r2 = cast(str, r1)
  1058. return r2
  1059. def negative_index(x):
  1060. x :: __main__.C
  1061. r0 :: list
  1062. r1 :: object
  1063. r2 :: str
  1064. L0:
  1065. r0 = borrow x.a
  1066. r1 = CPyList_GetItemShort(r0, -2)
  1067. r2 = cast(str, r1)
  1068. return r2
  1069. def lvar_index(x, n):
  1070. x :: __main__.C
  1071. n :: int
  1072. r0 :: list
  1073. r1 :: object
  1074. r2 :: str
  1075. L0:
  1076. r0 = borrow x.a
  1077. r1 = CPyList_GetItem(r0, n)
  1078. r2 = cast(str, r1)
  1079. return r2
  1080. [case testBorrowListGetItem2]
  1081. from typing import List
  1082. def attr_before_index(x: C) -> str:
  1083. return x.a[x.n]
  1084. def attr_after_index(a: List[C], i: int) -> int:
  1085. return a[i].n
  1086. def attr_after_index_literal(a: List[C]) -> int:
  1087. return a[0].n
  1088. class C:
  1089. a: List[str]
  1090. n: int
  1091. [out]
  1092. def attr_before_index(x):
  1093. x :: __main__.C
  1094. r0 :: list
  1095. r1 :: int
  1096. r2 :: object
  1097. r3 :: str
  1098. L0:
  1099. r0 = borrow x.a
  1100. r1 = borrow x.n
  1101. r2 = CPyList_GetItem(r0, r1)
  1102. r3 = cast(str, r2)
  1103. return r3
  1104. def attr_after_index(a, i):
  1105. a :: list
  1106. i :: int
  1107. r0 :: object
  1108. r1 :: __main__.C
  1109. r2 :: int
  1110. L0:
  1111. r0 = CPyList_GetItemBorrow(a, i)
  1112. r1 = borrow cast(__main__.C, r0)
  1113. r2 = r1.n
  1114. return r2
  1115. def attr_after_index_literal(a):
  1116. a :: list
  1117. r0 :: object
  1118. r1 :: __main__.C
  1119. r2 :: int
  1120. L0:
  1121. r0 = CPyList_GetItemShortBorrow(a, 0)
  1122. r1 = borrow cast(__main__.C, r0)
  1123. r2 = r1.n
  1124. return r2
  1125. [case testCannotBorrowListGetItem]
  1126. from typing import List
  1127. def func_index(x: C) -> str:
  1128. return x.a[f()]
  1129. def f() -> int: return 0
  1130. class C:
  1131. a: List[str]
  1132. [out]
  1133. def func_index(x):
  1134. x :: __main__.C
  1135. r0 :: list
  1136. r1 :: int
  1137. r2 :: object
  1138. r3 :: str
  1139. L0:
  1140. r0 = x.a
  1141. r1 = f()
  1142. r2 = CPyList_GetItem(r0, r1)
  1143. dec_ref r0
  1144. dec_ref r1 :: int
  1145. r3 = cast(str, r2)
  1146. return r3
  1147. def f():
  1148. L0:
  1149. return 0
  1150. [case testBorrowListGetItemKeepAlive]
  1151. from typing import List
  1152. def f() -> str:
  1153. a = [C()]
  1154. return a[0].s
  1155. class C:
  1156. s: str
  1157. [out]
  1158. def f():
  1159. r0 :: __main__.C
  1160. r1 :: list
  1161. r2, r3 :: ptr
  1162. a :: list
  1163. r4 :: object
  1164. r5 :: __main__.C
  1165. r6 :: str
  1166. L0:
  1167. r0 = C()
  1168. r1 = PyList_New(1)
  1169. r2 = get_element_ptr r1 ob_item :: PyListObject
  1170. r3 = load_mem r2 :: ptr*
  1171. set_mem r3, r0 :: builtins.object*
  1172. a = r1
  1173. r4 = CPyList_GetItemShortBorrow(a, 0)
  1174. r5 = borrow cast(__main__.C, r4)
  1175. r6 = r5.s
  1176. dec_ref a
  1177. return r6
  1178. [case testBorrowSetAttrObject]
  1179. from typing import Optional
  1180. def f(x: Optional[C]) -> None:
  1181. if x is not None:
  1182. x.b = True
  1183. def g(x: D) -> None:
  1184. x.c.b = False
  1185. class C:
  1186. b: bool
  1187. class D:
  1188. c: C
  1189. [out]
  1190. def f(x):
  1191. x :: union[__main__.C, None]
  1192. r0 :: object
  1193. r1 :: bit
  1194. r2 :: __main__.C
  1195. r3 :: bool
  1196. L0:
  1197. r0 = load_address _Py_NoneStruct
  1198. r1 = x != r0
  1199. if r1 goto L1 else goto L2 :: bool
  1200. L1:
  1201. r2 = borrow cast(__main__.C, x)
  1202. r2.b = 1; r3 = is_error
  1203. L2:
  1204. return 1
  1205. def g(x):
  1206. x :: __main__.D
  1207. r0 :: __main__.C
  1208. r1 :: bool
  1209. L0:
  1210. r0 = borrow x.c
  1211. r0.b = 0; r1 = is_error
  1212. return 1
  1213. [case testBorrowIntEquality]
  1214. def add(c: C) -> bool:
  1215. return c.x == c.y
  1216. class C:
  1217. x: int
  1218. y: int
  1219. [out]
  1220. def add(c):
  1221. c :: __main__.C
  1222. r0, r1 :: int
  1223. r2 :: native_int
  1224. r3, r4 :: bit
  1225. r5 :: bool
  1226. r6 :: bit
  1227. L0:
  1228. r0 = borrow c.x
  1229. r1 = borrow c.y
  1230. r2 = r0 & 1
  1231. r3 = r2 == 0
  1232. if r3 goto L1 else goto L2 :: bool
  1233. L1:
  1234. r4 = r0 == r1
  1235. r5 = r4
  1236. goto L3
  1237. L2:
  1238. r6 = CPyTagged_IsEq_(r0, r1)
  1239. r5 = r6
  1240. L3:
  1241. return r5
  1242. [case testBorrowIntLessThan]
  1243. def add(c: C) -> bool:
  1244. return c.x < c.y
  1245. class C:
  1246. x: int
  1247. y: int
  1248. [out]
  1249. def add(c):
  1250. c :: __main__.C
  1251. r0, r1 :: int
  1252. r2 :: native_int
  1253. r3 :: bit
  1254. r4 :: native_int
  1255. r5, r6, r7 :: bit
  1256. r8 :: bool
  1257. r9 :: bit
  1258. L0:
  1259. r0 = borrow c.x
  1260. r1 = borrow c.y
  1261. r2 = r0 & 1
  1262. r3 = r2 == 0
  1263. r4 = r1 & 1
  1264. r5 = r4 == 0
  1265. r6 = r3 & r5
  1266. if r6 goto L1 else goto L2 :: bool
  1267. L1:
  1268. r7 = r0 < r1 :: signed
  1269. r8 = r7
  1270. goto L3
  1271. L2:
  1272. r9 = CPyTagged_IsLt_(r0, r1)
  1273. r8 = r9
  1274. L3:
  1275. return r8
  1276. [case testBorrowIntCompareFinal]
  1277. from typing_extensions import Final
  1278. X: Final = 10
  1279. def add(c: C) -> bool:
  1280. return c.x == X
  1281. class C:
  1282. x: int
  1283. [out]
  1284. def add(c):
  1285. c :: __main__.C
  1286. r0 :: int
  1287. r1 :: native_int
  1288. r2, r3 :: bit
  1289. r4 :: bool
  1290. r5 :: bit
  1291. L0:
  1292. r0 = borrow c.x
  1293. r1 = r0 & 1
  1294. r2 = r1 == 0
  1295. if r2 goto L1 else goto L2 :: bool
  1296. L1:
  1297. r3 = r0 == 20
  1298. r4 = r3
  1299. goto L3
  1300. L2:
  1301. r5 = CPyTagged_IsEq_(r0, 20)
  1302. r4 = r5
  1303. L3:
  1304. return r4
  1305. [case testBorrowIntArithmetic]
  1306. def add(c: C) -> int:
  1307. return c.x + c.y
  1308. def sub(c: C) -> int:
  1309. return c.x - c.y
  1310. class C:
  1311. x: int
  1312. y: int
  1313. [out]
  1314. def add(c):
  1315. c :: __main__.C
  1316. r0, r1, r2 :: int
  1317. L0:
  1318. r0 = borrow c.x
  1319. r1 = borrow c.y
  1320. r2 = CPyTagged_Add(r0, r1)
  1321. return r2
  1322. def sub(c):
  1323. c :: __main__.C
  1324. r0, r1, r2 :: int
  1325. L0:
  1326. r0 = borrow c.x
  1327. r1 = borrow c.y
  1328. r2 = CPyTagged_Subtract(r0, r1)
  1329. return r2
  1330. [case testBorrowIntComparisonInIf]
  1331. def add(c: C, n: int) -> bool:
  1332. if c.x == c.y:
  1333. return True
  1334. return False
  1335. class C:
  1336. x: int
  1337. y: int
  1338. [out]
  1339. def add(c, n):
  1340. c :: __main__.C
  1341. n, r0, r1 :: int
  1342. r2 :: native_int
  1343. r3, r4, r5 :: bit
  1344. L0:
  1345. r0 = borrow c.x
  1346. r1 = borrow c.y
  1347. r2 = r0 & 1
  1348. r3 = r2 != 0
  1349. if r3 goto L1 else goto L2 :: bool
  1350. L1:
  1351. r4 = CPyTagged_IsEq_(r0, r1)
  1352. if r4 goto L3 else goto L4 :: bool
  1353. L2:
  1354. r5 = r0 == r1
  1355. if r5 goto L3 else goto L4 :: bool
  1356. L3:
  1357. return 1
  1358. L4:
  1359. return 0
  1360. [case testBorrowIntInPlaceOp]
  1361. def add(c: C, n: int) -> None:
  1362. c.x += n
  1363. def sub(c: C, n: int) -> None:
  1364. c.x -= c.y
  1365. class C:
  1366. x: int
  1367. y: int
  1368. [out]
  1369. def add(c, n):
  1370. c :: __main__.C
  1371. n, r0, r1 :: int
  1372. r2 :: bool
  1373. L0:
  1374. r0 = borrow c.x
  1375. r1 = CPyTagged_Add(r0, n)
  1376. c.x = r1; r2 = is_error
  1377. return 1
  1378. def sub(c, n):
  1379. c :: __main__.C
  1380. n, r0, r1, r2 :: int
  1381. r3 :: bool
  1382. L0:
  1383. r0 = borrow c.x
  1384. r1 = borrow c.y
  1385. r2 = CPyTagged_Subtract(r0, r1)
  1386. c.x = r2; r3 = is_error
  1387. return 1
  1388. [case testCoerceIntToI64_64bit]
  1389. from mypy_extensions import i64
  1390. def f(x: int) -> i64:
  1391. # TODO: On the fast path we shouldn't have a decref. Once we have high-level IR,
  1392. # coercion from int to i64 can be a single op, which makes it easier to
  1393. # generate optimal refcount handling for this case.
  1394. return x + 1
  1395. [out]
  1396. def f(x):
  1397. x, r0 :: int
  1398. r1 :: native_int
  1399. r2 :: bit
  1400. r3, r4 :: int64
  1401. r5 :: ptr
  1402. r6 :: c_ptr
  1403. r7 :: int64
  1404. L0:
  1405. r0 = CPyTagged_Add(x, 2)
  1406. r1 = r0 & 1
  1407. r2 = r1 == 0
  1408. if r2 goto L1 else goto L2 :: bool
  1409. L1:
  1410. r3 = r0 >> 1
  1411. dec_ref r0 :: int
  1412. r4 = r3
  1413. goto L3
  1414. L2:
  1415. r5 = r0 ^ 1
  1416. r6 = r5
  1417. r7 = CPyLong_AsInt64(r6)
  1418. r4 = r7
  1419. dec_ref r0 :: int
  1420. L3:
  1421. return r4