irbuild-match.test 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708
  1. [case testMatchValuePattern_python3_10]
  2. def f():
  3. match 123:
  4. case 123:
  5. print("matched")
  6. [out]
  7. def f():
  8. r0 :: bit
  9. r1 :: str
  10. r2 :: object
  11. r3 :: str
  12. r4 :: object
  13. r5 :: object[1]
  14. r6 :: object_ptr
  15. r7, r8 :: object
  16. L0:
  17. r0 = 246 == 246
  18. if r0 goto L1 else goto L2 :: bool
  19. L1:
  20. r1 = 'matched'
  21. r2 = builtins :: module
  22. r3 = 'print'
  23. r4 = CPyObject_GetAttr(r2, r3)
  24. r5 = [r1]
  25. r6 = load_address r5
  26. r7 = _PyObject_Vectorcall(r4, r6, 1, 0)
  27. keep_alive r1
  28. goto L3
  29. L2:
  30. L3:
  31. r8 = box(None, 1)
  32. return r8
  33. [case testMatchOrPattern_python3_10]
  34. def f():
  35. match 123:
  36. case 123 | 456:
  37. print("matched")
  38. [out]
  39. def f():
  40. r0, r1 :: bit
  41. r2 :: str
  42. r3 :: object
  43. r4 :: str
  44. r5 :: object
  45. r6 :: object[1]
  46. r7 :: object_ptr
  47. r8, r9 :: object
  48. L0:
  49. r0 = 246 == 246
  50. if r0 goto L3 else goto L1 :: bool
  51. L1:
  52. r1 = 246 == 912
  53. if r1 goto L3 else goto L2 :: bool
  54. L2:
  55. goto L4
  56. L3:
  57. r2 = 'matched'
  58. r3 = builtins :: module
  59. r4 = 'print'
  60. r5 = CPyObject_GetAttr(r3, r4)
  61. r6 = [r2]
  62. r7 = load_address r6
  63. r8 = _PyObject_Vectorcall(r5, r7, 1, 0)
  64. keep_alive r2
  65. goto L5
  66. L4:
  67. L5:
  68. r9 = box(None, 1)
  69. return r9
  70. [case testMatchOrPatternManyPatterns_python3_10]
  71. def f():
  72. match 1:
  73. case 1 | 2 | 3 | 4:
  74. print("matched")
  75. [out]
  76. def f():
  77. r0, r1, r2, r3 :: bit
  78. r4 :: str
  79. r5 :: object
  80. r6 :: str
  81. r7 :: object
  82. r8 :: object[1]
  83. r9 :: object_ptr
  84. r10, r11 :: object
  85. L0:
  86. r0 = 2 == 2
  87. if r0 goto L5 else goto L1 :: bool
  88. L1:
  89. r1 = 2 == 4
  90. if r1 goto L5 else goto L2 :: bool
  91. L2:
  92. r2 = 2 == 6
  93. if r2 goto L5 else goto L3 :: bool
  94. L3:
  95. r3 = 2 == 8
  96. if r3 goto L5 else goto L4 :: bool
  97. L4:
  98. goto L6
  99. L5:
  100. r4 = 'matched'
  101. r5 = builtins :: module
  102. r6 = 'print'
  103. r7 = CPyObject_GetAttr(r5, r6)
  104. r8 = [r4]
  105. r9 = load_address r8
  106. r10 = _PyObject_Vectorcall(r7, r9, 1, 0)
  107. keep_alive r4
  108. goto L7
  109. L6:
  110. L7:
  111. r11 = box(None, 1)
  112. return r11
  113. [case testMatchClassPattern_python3_10]
  114. def f():
  115. match 123:
  116. case int():
  117. print("matched")
  118. [out]
  119. def f():
  120. r0, r1 :: object
  121. r2 :: bool
  122. r3 :: str
  123. r4 :: object
  124. r5 :: str
  125. r6 :: object
  126. r7 :: object[1]
  127. r8 :: object_ptr
  128. r9, r10 :: object
  129. L0:
  130. r0 = load_address PyLong_Type
  131. r1 = object 123
  132. r2 = CPy_TypeCheck(r1, r0)
  133. if r2 goto L1 else goto L2 :: bool
  134. L1:
  135. r3 = 'matched'
  136. r4 = builtins :: module
  137. r5 = 'print'
  138. r6 = CPyObject_GetAttr(r4, r5)
  139. r7 = [r3]
  140. r8 = load_address r7
  141. r9 = _PyObject_Vectorcall(r6, r8, 1, 0)
  142. keep_alive r3
  143. goto L3
  144. L2:
  145. L3:
  146. r10 = box(None, 1)
  147. return r10
  148. [case testMatchExaustivePattern_python3_10]
  149. def f():
  150. match 123:
  151. case _:
  152. print("matched")
  153. [out]
  154. def f():
  155. r0 :: str
  156. r1 :: object
  157. r2 :: str
  158. r3 :: object
  159. r4 :: object[1]
  160. r5 :: object_ptr
  161. r6, r7 :: object
  162. L0:
  163. L1:
  164. r0 = 'matched'
  165. r1 = builtins :: module
  166. r2 = 'print'
  167. r3 = CPyObject_GetAttr(r1, r2)
  168. r4 = [r0]
  169. r5 = load_address r4
  170. r6 = _PyObject_Vectorcall(r3, r5, 1, 0)
  171. keep_alive r0
  172. goto L3
  173. L2:
  174. L3:
  175. r7 = box(None, 1)
  176. return r7
  177. [case testMatchMultipleBodies_python3_10]
  178. def f():
  179. match 123:
  180. case 123:
  181. print("matched")
  182. case 456:
  183. print("no match")
  184. [out]
  185. def f():
  186. r0 :: bit
  187. r1 :: str
  188. r2 :: object
  189. r3 :: str
  190. r4 :: object
  191. r5 :: object[1]
  192. r6 :: object_ptr
  193. r7 :: object
  194. r8 :: bit
  195. r9 :: str
  196. r10 :: object
  197. r11 :: str
  198. r12 :: object
  199. r13 :: object[1]
  200. r14 :: object_ptr
  201. r15, r16 :: object
  202. L0:
  203. r0 = 246 == 246
  204. if r0 goto L1 else goto L2 :: bool
  205. L1:
  206. r1 = 'matched'
  207. r2 = builtins :: module
  208. r3 = 'print'
  209. r4 = CPyObject_GetAttr(r2, r3)
  210. r5 = [r1]
  211. r6 = load_address r5
  212. r7 = _PyObject_Vectorcall(r4, r6, 1, 0)
  213. keep_alive r1
  214. goto L5
  215. L2:
  216. r8 = 246 == 912
  217. if r8 goto L3 else goto L4 :: bool
  218. L3:
  219. r9 = 'no match'
  220. r10 = builtins :: module
  221. r11 = 'print'
  222. r12 = CPyObject_GetAttr(r10, r11)
  223. r13 = [r9]
  224. r14 = load_address r13
  225. r15 = _PyObject_Vectorcall(r12, r14, 1, 0)
  226. keep_alive r9
  227. goto L5
  228. L4:
  229. L5:
  230. r16 = box(None, 1)
  231. return r16
  232. [case testMatchMultiBodyAndComplexOr_python3_10]
  233. def f():
  234. match 123:
  235. case 1:
  236. print("here 1")
  237. case 2 | 3:
  238. print("here 2 | 3")
  239. case 123:
  240. print("here 123")
  241. [out]
  242. def f():
  243. r0 :: bit
  244. r1 :: str
  245. r2 :: object
  246. r3 :: str
  247. r4 :: object
  248. r5 :: object[1]
  249. r6 :: object_ptr
  250. r7 :: object
  251. r8, r9 :: bit
  252. r10 :: str
  253. r11 :: object
  254. r12 :: str
  255. r13 :: object
  256. r14 :: object[1]
  257. r15 :: object_ptr
  258. r16 :: object
  259. r17 :: bit
  260. r18 :: str
  261. r19 :: object
  262. r20 :: str
  263. r21 :: object
  264. r22 :: object[1]
  265. r23 :: object_ptr
  266. r24, r25 :: object
  267. L0:
  268. r0 = 246 == 2
  269. if r0 goto L1 else goto L2 :: bool
  270. L1:
  271. r1 = 'here 1'
  272. r2 = builtins :: module
  273. r3 = 'print'
  274. r4 = CPyObject_GetAttr(r2, r3)
  275. r5 = [r1]
  276. r6 = load_address r5
  277. r7 = _PyObject_Vectorcall(r4, r6, 1, 0)
  278. keep_alive r1
  279. goto L9
  280. L2:
  281. r8 = 246 == 4
  282. if r8 goto L5 else goto L3 :: bool
  283. L3:
  284. r9 = 246 == 6
  285. if r9 goto L5 else goto L4 :: bool
  286. L4:
  287. goto L6
  288. L5:
  289. r10 = 'here 2 | 3'
  290. r11 = builtins :: module
  291. r12 = 'print'
  292. r13 = CPyObject_GetAttr(r11, r12)
  293. r14 = [r10]
  294. r15 = load_address r14
  295. r16 = _PyObject_Vectorcall(r13, r15, 1, 0)
  296. keep_alive r10
  297. goto L9
  298. L6:
  299. r17 = 246 == 246
  300. if r17 goto L7 else goto L8 :: bool
  301. L7:
  302. r18 = 'here 123'
  303. r19 = builtins :: module
  304. r20 = 'print'
  305. r21 = CPyObject_GetAttr(r19, r20)
  306. r22 = [r18]
  307. r23 = load_address r22
  308. r24 = _PyObject_Vectorcall(r21, r23, 1, 0)
  309. keep_alive r18
  310. goto L9
  311. L8:
  312. L9:
  313. r25 = box(None, 1)
  314. return r25
  315. [case testMatchWithGuard_python3_10]
  316. def f():
  317. match 123:
  318. case 123 if True:
  319. print("matched")
  320. [out]
  321. def f():
  322. r0 :: bit
  323. r1 :: str
  324. r2 :: object
  325. r3 :: str
  326. r4 :: object
  327. r5 :: object[1]
  328. r6 :: object_ptr
  329. r7, r8 :: object
  330. L0:
  331. r0 = 246 == 246
  332. if r0 goto L1 else goto L3 :: bool
  333. L1:
  334. if 1 goto L2 else goto L3 :: bool
  335. L2:
  336. r1 = 'matched'
  337. r2 = builtins :: module
  338. r3 = 'print'
  339. r4 = CPyObject_GetAttr(r2, r3)
  340. r5 = [r1]
  341. r6 = load_address r5
  342. r7 = _PyObject_Vectorcall(r4, r6, 1, 0)
  343. keep_alive r1
  344. goto L4
  345. L3:
  346. L4:
  347. r8 = box(None, 1)
  348. return r8
  349. [case testMatchSingleton_python3_10]
  350. def f():
  351. match 123:
  352. case True:
  353. print("value is True")
  354. case False:
  355. print("value is False")
  356. case None:
  357. print("value is None")
  358. [out]
  359. def f():
  360. r0, r1 :: object
  361. r2 :: bit
  362. r3 :: str
  363. r4 :: object
  364. r5 :: str
  365. r6 :: object
  366. r7 :: object[1]
  367. r8 :: object_ptr
  368. r9, r10, r11 :: object
  369. r12 :: bit
  370. r13 :: str
  371. r14 :: object
  372. r15 :: str
  373. r16 :: object
  374. r17 :: object[1]
  375. r18 :: object_ptr
  376. r19, r20, r21 :: object
  377. r22 :: bit
  378. r23 :: str
  379. r24 :: object
  380. r25 :: str
  381. r26 :: object
  382. r27 :: object[1]
  383. r28 :: object_ptr
  384. r29, r30 :: object
  385. L0:
  386. r0 = object 123
  387. r1 = box(bool, 1)
  388. r2 = r0 == r1
  389. if r2 goto L1 else goto L2 :: bool
  390. L1:
  391. r3 = 'value is True'
  392. r4 = builtins :: module
  393. r5 = 'print'
  394. r6 = CPyObject_GetAttr(r4, r5)
  395. r7 = [r3]
  396. r8 = load_address r7
  397. r9 = _PyObject_Vectorcall(r6, r8, 1, 0)
  398. keep_alive r3
  399. goto L7
  400. L2:
  401. r10 = object 123
  402. r11 = box(bool, 0)
  403. r12 = r10 == r11
  404. if r12 goto L3 else goto L4 :: bool
  405. L3:
  406. r13 = 'value is False'
  407. r14 = builtins :: module
  408. r15 = 'print'
  409. r16 = CPyObject_GetAttr(r14, r15)
  410. r17 = [r13]
  411. r18 = load_address r17
  412. r19 = _PyObject_Vectorcall(r16, r18, 1, 0)
  413. keep_alive r13
  414. goto L7
  415. L4:
  416. r20 = load_address _Py_NoneStruct
  417. r21 = object 123
  418. r22 = r21 == r20
  419. if r22 goto L5 else goto L6 :: bool
  420. L5:
  421. r23 = 'value is None'
  422. r24 = builtins :: module
  423. r25 = 'print'
  424. r26 = CPyObject_GetAttr(r24, r25)
  425. r27 = [r23]
  426. r28 = load_address r27
  427. r29 = _PyObject_Vectorcall(r26, r28, 1, 0)
  428. keep_alive r23
  429. goto L7
  430. L6:
  431. L7:
  432. r30 = box(None, 1)
  433. return r30
  434. [case testMatchRecursiveOrPattern_python3_10]
  435. def f():
  436. match 1:
  437. case 1 | int():
  438. print("matched")
  439. [out]
  440. def f():
  441. r0 :: bit
  442. r1, r2 :: object
  443. r3 :: bool
  444. r4 :: str
  445. r5 :: object
  446. r6 :: str
  447. r7 :: object
  448. r8 :: object[1]
  449. r9 :: object_ptr
  450. r10, r11 :: object
  451. L0:
  452. r0 = 2 == 2
  453. if r0 goto L3 else goto L1 :: bool
  454. L1:
  455. r1 = load_address PyLong_Type
  456. r2 = object 1
  457. r3 = CPy_TypeCheck(r2, r1)
  458. if r3 goto L3 else goto L2 :: bool
  459. L2:
  460. goto L4
  461. L3:
  462. r4 = 'matched'
  463. r5 = builtins :: module
  464. r6 = 'print'
  465. r7 = CPyObject_GetAttr(r5, r6)
  466. r8 = [r4]
  467. r9 = load_address r8
  468. r10 = _PyObject_Vectorcall(r7, r9, 1, 0)
  469. keep_alive r4
  470. goto L5
  471. L4:
  472. L5:
  473. r11 = box(None, 1)
  474. return r11
  475. [case testMatchAsPattern_python3_10]
  476. def f():
  477. match 123:
  478. case 123 as x:
  479. print(x)
  480. [out]
  481. def f():
  482. r0 :: bit
  483. r1, x, r2 :: object
  484. r3 :: str
  485. r4 :: object
  486. r5 :: object[1]
  487. r6 :: object_ptr
  488. r7, r8 :: object
  489. L0:
  490. r0 = 246 == 246
  491. r1 = object 123
  492. x = r1
  493. if r0 goto L1 else goto L2 :: bool
  494. L1:
  495. r2 = builtins :: module
  496. r3 = 'print'
  497. r4 = CPyObject_GetAttr(r2, r3)
  498. r5 = [x]
  499. r6 = load_address r5
  500. r7 = _PyObject_Vectorcall(r4, r6, 1, 0)
  501. keep_alive x
  502. goto L3
  503. L2:
  504. L3:
  505. r8 = box(None, 1)
  506. return r8
  507. [case testMatchAsPatternOnOrPattern_python3_10]
  508. def f():
  509. match 1:
  510. case (1 | 2) as x:
  511. print(x)
  512. [out]
  513. def f():
  514. r0 :: bit
  515. r1, x :: object
  516. r2 :: bit
  517. r3, r4 :: object
  518. r5 :: str
  519. r6 :: object
  520. r7 :: object[1]
  521. r8 :: object_ptr
  522. r9, r10 :: object
  523. L0:
  524. r0 = 2 == 2
  525. r1 = object 1
  526. x = r1
  527. if r0 goto L3 else goto L1 :: bool
  528. L1:
  529. r2 = 2 == 4
  530. r3 = object 2
  531. x = r3
  532. if r2 goto L3 else goto L2 :: bool
  533. L2:
  534. goto L4
  535. L3:
  536. r4 = builtins :: module
  537. r5 = 'print'
  538. r6 = CPyObject_GetAttr(r4, r5)
  539. r7 = [x]
  540. r8 = load_address r7
  541. r9 = _PyObject_Vectorcall(r6, r8, 1, 0)
  542. keep_alive x
  543. goto L5
  544. L4:
  545. L5:
  546. r10 = box(None, 1)
  547. return r10
  548. [case testMatchAsPatternOnClassPattern_python3_10]
  549. def f():
  550. match 123:
  551. case int() as i:
  552. print(i)
  553. [out]
  554. def f():
  555. r0, r1 :: object
  556. r2 :: bool
  557. i :: int
  558. r3 :: object
  559. r4 :: str
  560. r5, r6 :: object
  561. r7 :: object[1]
  562. r8 :: object_ptr
  563. r9, r10 :: object
  564. L0:
  565. r0 = load_address PyLong_Type
  566. r1 = object 123
  567. r2 = CPy_TypeCheck(r1, r0)
  568. if r2 goto L1 else goto L3 :: bool
  569. L1:
  570. i = 246
  571. L2:
  572. r3 = builtins :: module
  573. r4 = 'print'
  574. r5 = CPyObject_GetAttr(r3, r4)
  575. r6 = box(int, i)
  576. r7 = [r6]
  577. r8 = load_address r7
  578. r9 = _PyObject_Vectorcall(r5, r8, 1, 0)
  579. keep_alive r6
  580. goto L4
  581. L3:
  582. L4:
  583. r10 = box(None, 1)
  584. return r10
  585. [case testMatchClassPatternWithPositionalArgs_python3_10]
  586. class Position:
  587. __match_args__ = ("x", "y", "z")
  588. x: int
  589. y: int
  590. z: int
  591. def f(x):
  592. match x:
  593. case Position(1, 2, 3):
  594. print("matched")
  595. [out]
  596. def Position.__mypyc_defaults_setup(__mypyc_self__):
  597. __mypyc_self__ :: __main__.Position
  598. r0, r1, r2 :: str
  599. r3 :: tuple[str, str, str]
  600. L0:
  601. r0 = 'x'
  602. r1 = 'y'
  603. r2 = 'z'
  604. r3 = (r0, r1, r2)
  605. __mypyc_self__.__match_args__ = r3
  606. return 1
  607. def f(x):
  608. x, r0 :: object
  609. r1 :: i32
  610. r2 :: bit
  611. r3 :: bool
  612. r4 :: str
  613. r5, r6, r7 :: object
  614. r8 :: i32
  615. r9 :: bit
  616. r10 :: bool
  617. r11 :: str
  618. r12, r13, r14 :: object
  619. r15 :: i32
  620. r16 :: bit
  621. r17 :: bool
  622. r18 :: str
  623. r19, r20, r21 :: object
  624. r22 :: i32
  625. r23 :: bit
  626. r24 :: bool
  627. r25 :: str
  628. r26 :: object
  629. r27 :: str
  630. r28 :: object
  631. r29 :: object[1]
  632. r30 :: object_ptr
  633. r31, r32 :: object
  634. L0:
  635. r0 = __main__.Position :: type
  636. r1 = PyObject_IsInstance(x, r0)
  637. r2 = r1 >= 0 :: signed
  638. r3 = truncate r1: i32 to builtins.bool
  639. if r3 goto L1 else goto L5 :: bool
  640. L1:
  641. r4 = 'x'
  642. r5 = CPyObject_GetAttr(x, r4)
  643. r6 = object 1
  644. r7 = PyObject_RichCompare(r5, r6, 2)
  645. r8 = PyObject_IsTrue(r7)
  646. r9 = r8 >= 0 :: signed
  647. r10 = truncate r8: i32 to builtins.bool
  648. if r10 goto L2 else goto L5 :: bool
  649. L2:
  650. r11 = 'y'
  651. r12 = CPyObject_GetAttr(x, r11)
  652. r13 = object 2
  653. r14 = PyObject_RichCompare(r12, r13, 2)
  654. r15 = PyObject_IsTrue(r14)
  655. r16 = r15 >= 0 :: signed
  656. r17 = truncate r15: i32 to builtins.bool
  657. if r17 goto L3 else goto L5 :: bool
  658. L3:
  659. r18 = 'z'
  660. r19 = CPyObject_GetAttr(x, r18)
  661. r20 = object 3
  662. r21 = PyObject_RichCompare(r19, r20, 2)
  663. r22 = PyObject_IsTrue(r21)
  664. r23 = r22 >= 0 :: signed
  665. r24 = truncate r22: i32 to builtins.bool
  666. if r24 goto L4 else goto L5 :: bool
  667. L4:
  668. r25 = 'matched'
  669. r26 = builtins :: module
  670. r27 = 'print'
  671. r28 = CPyObject_GetAttr(r26, r27)
  672. r29 = [r25]
  673. r30 = load_address r29
  674. r31 = _PyObject_Vectorcall(r28, r30, 1, 0)
  675. keep_alive r25
  676. goto L6
  677. L5:
  678. L6:
  679. r32 = box(None, 1)
  680. return r32
  681. [case testMatchClassPatternWithKeywordPatterns_python3_10]
  682. class Position:
  683. x: int
  684. y: int
  685. z: int
  686. def f(x):
  687. match x:
  688. case Position(z=1, y=2, x=3):
  689. print("matched")
  690. [out]
  691. def f(x):
  692. x, r0 :: object
  693. r1 :: i32
  694. r2 :: bit
  695. r3 :: bool
  696. r4 :: str
  697. r5, r6, r7 :: object
  698. r8 :: i32
  699. r9 :: bit
  700. r10 :: bool
  701. r11 :: str
  702. r12, r13, r14 :: object
  703. r15 :: i32
  704. r16 :: bit
  705. r17 :: bool
  706. r18 :: str
  707. r19, r20, r21 :: object
  708. r22 :: i32
  709. r23 :: bit
  710. r24 :: bool
  711. r25 :: str
  712. r26 :: object
  713. r27 :: str
  714. r28 :: object
  715. r29 :: object[1]
  716. r30 :: object_ptr
  717. r31, r32 :: object
  718. L0:
  719. r0 = __main__.Position :: type
  720. r1 = PyObject_IsInstance(x, r0)
  721. r2 = r1 >= 0 :: signed
  722. r3 = truncate r1: i32 to builtins.bool
  723. if r3 goto L1 else goto L5 :: bool
  724. L1:
  725. r4 = 'z'
  726. r5 = CPyObject_GetAttr(x, r4)
  727. r6 = object 1
  728. r7 = PyObject_RichCompare(r5, r6, 2)
  729. r8 = PyObject_IsTrue(r7)
  730. r9 = r8 >= 0 :: signed
  731. r10 = truncate r8: i32 to builtins.bool
  732. if r10 goto L2 else goto L5 :: bool
  733. L2:
  734. r11 = 'y'
  735. r12 = CPyObject_GetAttr(x, r11)
  736. r13 = object 2
  737. r14 = PyObject_RichCompare(r12, r13, 2)
  738. r15 = PyObject_IsTrue(r14)
  739. r16 = r15 >= 0 :: signed
  740. r17 = truncate r15: i32 to builtins.bool
  741. if r17 goto L3 else goto L5 :: bool
  742. L3:
  743. r18 = 'x'
  744. r19 = CPyObject_GetAttr(x, r18)
  745. r20 = object 3
  746. r21 = PyObject_RichCompare(r19, r20, 2)
  747. r22 = PyObject_IsTrue(r21)
  748. r23 = r22 >= 0 :: signed
  749. r24 = truncate r22: i32 to builtins.bool
  750. if r24 goto L4 else goto L5 :: bool
  751. L4:
  752. r25 = 'matched'
  753. r26 = builtins :: module
  754. r27 = 'print'
  755. r28 = CPyObject_GetAttr(r26, r27)
  756. r29 = [r25]
  757. r30 = load_address r29
  758. r31 = _PyObject_Vectorcall(r28, r30, 1, 0)
  759. keep_alive r25
  760. goto L6
  761. L5:
  762. L6:
  763. r32 = box(None, 1)
  764. return r32
  765. [case testMatchClassPatternWithNestedPattern_python3_10]
  766. class C:
  767. num: int
  768. def f(x):
  769. match x:
  770. case C(num=1 | 2):
  771. print("matched")
  772. [out]
  773. def f(x):
  774. x, r0 :: object
  775. r1 :: i32
  776. r2 :: bit
  777. r3 :: bool
  778. r4 :: str
  779. r5, r6, r7 :: object
  780. r8 :: i32
  781. r9 :: bit
  782. r10 :: bool
  783. r11, r12 :: object
  784. r13 :: i32
  785. r14 :: bit
  786. r15 :: bool
  787. r16 :: str
  788. r17 :: object
  789. r18 :: str
  790. r19 :: object
  791. r20 :: object[1]
  792. r21 :: object_ptr
  793. r22, r23 :: object
  794. L0:
  795. r0 = __main__.C :: type
  796. r1 = PyObject_IsInstance(x, r0)
  797. r2 = r1 >= 0 :: signed
  798. r3 = truncate r1: i32 to builtins.bool
  799. if r3 goto L1 else goto L5 :: bool
  800. L1:
  801. r4 = 'num'
  802. r5 = CPyObject_GetAttr(x, r4)
  803. r6 = object 1
  804. r7 = PyObject_RichCompare(r5, r6, 2)
  805. r8 = PyObject_IsTrue(r7)
  806. r9 = r8 >= 0 :: signed
  807. r10 = truncate r8: i32 to builtins.bool
  808. if r10 goto L4 else goto L2 :: bool
  809. L2:
  810. r11 = object 2
  811. r12 = PyObject_RichCompare(r5, r11, 2)
  812. r13 = PyObject_IsTrue(r12)
  813. r14 = r13 >= 0 :: signed
  814. r15 = truncate r13: i32 to builtins.bool
  815. if r15 goto L4 else goto L3 :: bool
  816. L3:
  817. goto L5
  818. L4:
  819. r16 = 'matched'
  820. r17 = builtins :: module
  821. r18 = 'print'
  822. r19 = CPyObject_GetAttr(r17, r18)
  823. r20 = [r16]
  824. r21 = load_address r20
  825. r22 = _PyObject_Vectorcall(r19, r21, 1, 0)
  826. keep_alive r16
  827. goto L6
  828. L5:
  829. L6:
  830. r23 = box(None, 1)
  831. return r23
  832. [case testAsPatternDoesntBleedIntoSubPatterns_python3_10]
  833. class C:
  834. __match_args__ = ("a", "b")
  835. a: int
  836. b: int
  837. def f(x):
  838. match x:
  839. case C(1, 2) as y:
  840. print("matched")
  841. [out]
  842. def C.__mypyc_defaults_setup(__mypyc_self__):
  843. __mypyc_self__ :: __main__.C
  844. r0, r1 :: str
  845. r2 :: tuple[str, str]
  846. L0:
  847. r0 = 'a'
  848. r1 = 'b'
  849. r2 = (r0, r1)
  850. __mypyc_self__.__match_args__ = r2
  851. return 1
  852. def f(x):
  853. x, r0 :: object
  854. r1 :: i32
  855. r2 :: bit
  856. r3 :: bool
  857. r4, y :: __main__.C
  858. r5 :: str
  859. r6, r7, r8 :: object
  860. r9 :: i32
  861. r10 :: bit
  862. r11 :: bool
  863. r12 :: str
  864. r13, r14, r15 :: object
  865. r16 :: i32
  866. r17 :: bit
  867. r18 :: bool
  868. r19 :: str
  869. r20 :: object
  870. r21 :: str
  871. r22 :: object
  872. r23 :: object[1]
  873. r24 :: object_ptr
  874. r25, r26 :: object
  875. L0:
  876. r0 = __main__.C :: type
  877. r1 = PyObject_IsInstance(x, r0)
  878. r2 = r1 >= 0 :: signed
  879. r3 = truncate r1: i32 to builtins.bool
  880. if r3 goto L1 else goto L5 :: bool
  881. L1:
  882. r4 = cast(__main__.C, x)
  883. y = r4
  884. L2:
  885. r5 = 'a'
  886. r6 = CPyObject_GetAttr(x, r5)
  887. r7 = object 1
  888. r8 = PyObject_RichCompare(r6, r7, 2)
  889. r9 = PyObject_IsTrue(r8)
  890. r10 = r9 >= 0 :: signed
  891. r11 = truncate r9: i32 to builtins.bool
  892. if r11 goto L3 else goto L5 :: bool
  893. L3:
  894. r12 = 'b'
  895. r13 = CPyObject_GetAttr(x, r12)
  896. r14 = object 2
  897. r15 = PyObject_RichCompare(r13, r14, 2)
  898. r16 = PyObject_IsTrue(r15)
  899. r17 = r16 >= 0 :: signed
  900. r18 = truncate r16: i32 to builtins.bool
  901. if r18 goto L4 else goto L5 :: bool
  902. L4:
  903. r19 = 'matched'
  904. r20 = builtins :: module
  905. r21 = 'print'
  906. r22 = CPyObject_GetAttr(r20, r21)
  907. r23 = [r19]
  908. r24 = load_address r23
  909. r25 = _PyObject_Vectorcall(r22, r24, 1, 0)
  910. keep_alive r19
  911. goto L6
  912. L5:
  913. L6:
  914. r26 = box(None, 1)
  915. return r26
  916. [case testMatchClassPatternPositionalCapture_python3_10]
  917. class C:
  918. __match_args__ = ("x",)
  919. x: int
  920. def f(x):
  921. match x:
  922. case C(num):
  923. print("matched")
  924. [out]
  925. def C.__mypyc_defaults_setup(__mypyc_self__):
  926. __mypyc_self__ :: __main__.C
  927. r0 :: str
  928. r1 :: tuple[str]
  929. L0:
  930. r0 = 'x'
  931. r1 = (r0)
  932. __mypyc_self__.__match_args__ = r1
  933. return 1
  934. def f(x):
  935. x, r0 :: object
  936. r1 :: i32
  937. r2 :: bit
  938. r3 :: bool
  939. r4 :: str
  940. r5 :: object
  941. r6, num :: int
  942. r7 :: str
  943. r8 :: object
  944. r9 :: str
  945. r10 :: object
  946. r11 :: object[1]
  947. r12 :: object_ptr
  948. r13, r14 :: object
  949. L0:
  950. r0 = __main__.C :: type
  951. r1 = PyObject_IsInstance(x, r0)
  952. r2 = r1 >= 0 :: signed
  953. r3 = truncate r1: i32 to builtins.bool
  954. if r3 goto L1 else goto L3 :: bool
  955. L1:
  956. r4 = 'x'
  957. r5 = CPyObject_GetAttr(x, r4)
  958. r6 = unbox(int, r5)
  959. num = r6
  960. L2:
  961. r7 = 'matched'
  962. r8 = builtins :: module
  963. r9 = 'print'
  964. r10 = CPyObject_GetAttr(r8, r9)
  965. r11 = [r7]
  966. r12 = load_address r11
  967. r13 = _PyObject_Vectorcall(r10, r12, 1, 0)
  968. keep_alive r7
  969. goto L4
  970. L3:
  971. L4:
  972. r14 = box(None, 1)
  973. return r14
  974. [case testMatchMappingEmpty_python3_10]
  975. def f(x):
  976. match x:
  977. case {}:
  978. print("matched")
  979. [out]
  980. def f(x):
  981. x :: object
  982. r0 :: i32
  983. r1 :: bit
  984. r2 :: str
  985. r3 :: object
  986. r4 :: str
  987. r5 :: object
  988. r6 :: object[1]
  989. r7 :: object_ptr
  990. r8, r9 :: object
  991. L0:
  992. r0 = CPyMapping_Check(x)
  993. r1 = r0 != 0
  994. if r1 goto L1 else goto L2 :: bool
  995. L1:
  996. r2 = 'matched'
  997. r3 = builtins :: module
  998. r4 = 'print'
  999. r5 = CPyObject_GetAttr(r3, r4)
  1000. r6 = [r2]
  1001. r7 = load_address r6
  1002. r8 = _PyObject_Vectorcall(r5, r7, 1, 0)
  1003. keep_alive r2
  1004. goto L3
  1005. L2:
  1006. L3:
  1007. r9 = box(None, 1)
  1008. return r9
  1009. [case testMatchMappingPatternWithKeys_python3_10]
  1010. def f(x):
  1011. match x:
  1012. case {"key": "value"}:
  1013. print("matched")
  1014. [out]
  1015. def f(x):
  1016. x :: object
  1017. r0 :: i32
  1018. r1 :: bit
  1019. r2 :: str
  1020. r3 :: i32
  1021. r4 :: bit
  1022. r5 :: object
  1023. r6 :: str
  1024. r7 :: object
  1025. r8 :: i32
  1026. r9 :: bit
  1027. r10 :: bool
  1028. r11 :: str
  1029. r12 :: object
  1030. r13 :: str
  1031. r14 :: object
  1032. r15 :: object[1]
  1033. r16 :: object_ptr
  1034. r17, r18 :: object
  1035. L0:
  1036. r0 = CPyMapping_Check(x)
  1037. r1 = r0 != 0
  1038. if r1 goto L1 else goto L4 :: bool
  1039. L1:
  1040. r2 = 'key'
  1041. r3 = PyMapping_HasKey(x, r2)
  1042. r4 = r3 != 0
  1043. if r4 goto L2 else goto L4 :: bool
  1044. L2:
  1045. r5 = PyObject_GetItem(x, r2)
  1046. r6 = 'value'
  1047. r7 = PyObject_RichCompare(r5, r6, 2)
  1048. r8 = PyObject_IsTrue(r7)
  1049. r9 = r8 >= 0 :: signed
  1050. r10 = truncate r8: i32 to builtins.bool
  1051. if r10 goto L3 else goto L4 :: bool
  1052. L3:
  1053. r11 = 'matched'
  1054. r12 = builtins :: module
  1055. r13 = 'print'
  1056. r14 = CPyObject_GetAttr(r12, r13)
  1057. r15 = [r11]
  1058. r16 = load_address r15
  1059. r17 = _PyObject_Vectorcall(r14, r16, 1, 0)
  1060. keep_alive r11
  1061. goto L5
  1062. L4:
  1063. L5:
  1064. r18 = box(None, 1)
  1065. return r18
  1066. [case testMatchMappingPatternWithRest_python3_10]
  1067. def f(x):
  1068. match x:
  1069. case {**rest}:
  1070. print("matched")
  1071. [out]
  1072. def f(x):
  1073. x :: object
  1074. r0 :: i32
  1075. r1 :: bit
  1076. r2, rest :: dict
  1077. r3 :: str
  1078. r4 :: object
  1079. r5 :: str
  1080. r6 :: object
  1081. r7 :: object[1]
  1082. r8 :: object_ptr
  1083. r9, r10 :: object
  1084. L0:
  1085. r0 = CPyMapping_Check(x)
  1086. r1 = r0 != 0
  1087. if r1 goto L1 else goto L3 :: bool
  1088. L1:
  1089. r2 = CPyDict_FromAny(x)
  1090. rest = r2
  1091. L2:
  1092. r3 = 'matched'
  1093. r4 = builtins :: module
  1094. r5 = 'print'
  1095. r6 = CPyObject_GetAttr(r4, r5)
  1096. r7 = [r3]
  1097. r8 = load_address r7
  1098. r9 = _PyObject_Vectorcall(r6, r8, 1, 0)
  1099. keep_alive r3
  1100. goto L4
  1101. L3:
  1102. L4:
  1103. r10 = box(None, 1)
  1104. return r10
  1105. [case testMatchMappingPatternWithRestPopKeys_python3_10]
  1106. def f(x):
  1107. match x:
  1108. case {"key": "value", **rest}:
  1109. print("matched")
  1110. [out]
  1111. def f(x):
  1112. x :: object
  1113. r0 :: i32
  1114. r1 :: bit
  1115. r2 :: str
  1116. r3 :: i32
  1117. r4 :: bit
  1118. r5 :: object
  1119. r6 :: str
  1120. r7 :: object
  1121. r8 :: i32
  1122. r9 :: bit
  1123. r10 :: bool
  1124. r11, rest :: dict
  1125. r12 :: i32
  1126. r13 :: bit
  1127. r14 :: str
  1128. r15 :: object
  1129. r16 :: str
  1130. r17 :: object
  1131. r18 :: object[1]
  1132. r19 :: object_ptr
  1133. r20, r21 :: object
  1134. L0:
  1135. r0 = CPyMapping_Check(x)
  1136. r1 = r0 != 0
  1137. if r1 goto L1 else goto L5 :: bool
  1138. L1:
  1139. r2 = 'key'
  1140. r3 = PyMapping_HasKey(x, r2)
  1141. r4 = r3 != 0
  1142. if r4 goto L2 else goto L5 :: bool
  1143. L2:
  1144. r5 = PyObject_GetItem(x, r2)
  1145. r6 = 'value'
  1146. r7 = PyObject_RichCompare(r5, r6, 2)
  1147. r8 = PyObject_IsTrue(r7)
  1148. r9 = r8 >= 0 :: signed
  1149. r10 = truncate r8: i32 to builtins.bool
  1150. if r10 goto L3 else goto L5 :: bool
  1151. L3:
  1152. r11 = CPyDict_FromAny(x)
  1153. rest = r11
  1154. r12 = PyDict_DelItem(r11, r2)
  1155. r13 = r12 >= 0 :: signed
  1156. L4:
  1157. r14 = 'matched'
  1158. r15 = builtins :: module
  1159. r16 = 'print'
  1160. r17 = CPyObject_GetAttr(r15, r16)
  1161. r18 = [r14]
  1162. r19 = load_address r18
  1163. r20 = _PyObject_Vectorcall(r17, r19, 1, 0)
  1164. keep_alive r14
  1165. goto L6
  1166. L5:
  1167. L6:
  1168. r21 = box(None, 1)
  1169. return r21
  1170. [case testMatchEmptySequencePattern_python3_10]
  1171. def f(x):
  1172. match x:
  1173. case []:
  1174. print("matched")
  1175. [out]
  1176. def f(x):
  1177. x :: object
  1178. r0 :: i32
  1179. r1 :: bit
  1180. r2 :: native_int
  1181. r3, r4 :: bit
  1182. r5 :: str
  1183. r6 :: object
  1184. r7 :: str
  1185. r8 :: object
  1186. r9 :: object[1]
  1187. r10 :: object_ptr
  1188. r11, r12 :: object
  1189. L0:
  1190. r0 = CPySequence_Check(x)
  1191. r1 = r0 != 0
  1192. if r1 goto L1 else goto L3 :: bool
  1193. L1:
  1194. r2 = PyObject_Size(x)
  1195. r3 = r2 >= 0 :: signed
  1196. r4 = r2 == 0
  1197. if r4 goto L2 else goto L3 :: bool
  1198. L2:
  1199. r5 = 'matched'
  1200. r6 = builtins :: module
  1201. r7 = 'print'
  1202. r8 = CPyObject_GetAttr(r6, r7)
  1203. r9 = [r5]
  1204. r10 = load_address r9
  1205. r11 = _PyObject_Vectorcall(r8, r10, 1, 0)
  1206. keep_alive r5
  1207. goto L4
  1208. L3:
  1209. L4:
  1210. r12 = box(None, 1)
  1211. return r12
  1212. [case testMatchFixedLengthSequencePattern_python3_10]
  1213. def f(x):
  1214. match x:
  1215. case [1, 2]:
  1216. print("matched")
  1217. [out]
  1218. def f(x):
  1219. x :: object
  1220. r0 :: i32
  1221. r1 :: bit
  1222. r2 :: native_int
  1223. r3, r4 :: bit
  1224. r5, r6, r7 :: object
  1225. r8 :: i32
  1226. r9 :: bit
  1227. r10 :: bool
  1228. r11, r12, r13 :: object
  1229. r14 :: i32
  1230. r15 :: bit
  1231. r16 :: bool
  1232. r17 :: str
  1233. r18 :: object
  1234. r19 :: str
  1235. r20 :: object
  1236. r21 :: object[1]
  1237. r22 :: object_ptr
  1238. r23, r24 :: object
  1239. L0:
  1240. r0 = CPySequence_Check(x)
  1241. r1 = r0 != 0
  1242. if r1 goto L1 else goto L5 :: bool
  1243. L1:
  1244. r2 = PyObject_Size(x)
  1245. r3 = r2 >= 0 :: signed
  1246. r4 = r2 == 2
  1247. if r4 goto L2 else goto L5 :: bool
  1248. L2:
  1249. r5 = PySequence_GetItem(x, 0)
  1250. r6 = object 1
  1251. r7 = PyObject_RichCompare(r5, r6, 2)
  1252. r8 = PyObject_IsTrue(r7)
  1253. r9 = r8 >= 0 :: signed
  1254. r10 = truncate r8: i32 to builtins.bool
  1255. if r10 goto L3 else goto L5 :: bool
  1256. L3:
  1257. r11 = PySequence_GetItem(x, 1)
  1258. r12 = object 2
  1259. r13 = PyObject_RichCompare(r11, r12, 2)
  1260. r14 = PyObject_IsTrue(r13)
  1261. r15 = r14 >= 0 :: signed
  1262. r16 = truncate r14: i32 to builtins.bool
  1263. if r16 goto L4 else goto L5 :: bool
  1264. L4:
  1265. r17 = 'matched'
  1266. r18 = builtins :: module
  1267. r19 = 'print'
  1268. r20 = CPyObject_GetAttr(r18, r19)
  1269. r21 = [r17]
  1270. r22 = load_address r21
  1271. r23 = _PyObject_Vectorcall(r20, r22, 1, 0)
  1272. keep_alive r17
  1273. goto L6
  1274. L5:
  1275. L6:
  1276. r24 = box(None, 1)
  1277. return r24
  1278. [case testMatchSequencePatternWithTrailingUnboundStar_python3_10]
  1279. def f(x):
  1280. match x:
  1281. case [1, 2, *_]:
  1282. print("matched")
  1283. [out]
  1284. def f(x):
  1285. x :: object
  1286. r0 :: i32
  1287. r1 :: bit
  1288. r2 :: native_int
  1289. r3, r4 :: bit
  1290. r5, r6, r7 :: object
  1291. r8 :: i32
  1292. r9 :: bit
  1293. r10 :: bool
  1294. r11, r12, r13 :: object
  1295. r14 :: i32
  1296. r15 :: bit
  1297. r16 :: bool
  1298. r17 :: str
  1299. r18 :: object
  1300. r19 :: str
  1301. r20 :: object
  1302. r21 :: object[1]
  1303. r22 :: object_ptr
  1304. r23, r24 :: object
  1305. L0:
  1306. r0 = CPySequence_Check(x)
  1307. r1 = r0 != 0
  1308. if r1 goto L1 else goto L5 :: bool
  1309. L1:
  1310. r2 = PyObject_Size(x)
  1311. r3 = r2 >= 0 :: signed
  1312. r4 = r2 >= 2 :: signed
  1313. if r4 goto L2 else goto L5 :: bool
  1314. L2:
  1315. r5 = PySequence_GetItem(x, 0)
  1316. r6 = object 1
  1317. r7 = PyObject_RichCompare(r5, r6, 2)
  1318. r8 = PyObject_IsTrue(r7)
  1319. r9 = r8 >= 0 :: signed
  1320. r10 = truncate r8: i32 to builtins.bool
  1321. if r10 goto L3 else goto L5 :: bool
  1322. L3:
  1323. r11 = PySequence_GetItem(x, 1)
  1324. r12 = object 2
  1325. r13 = PyObject_RichCompare(r11, r12, 2)
  1326. r14 = PyObject_IsTrue(r13)
  1327. r15 = r14 >= 0 :: signed
  1328. r16 = truncate r14: i32 to builtins.bool
  1329. if r16 goto L4 else goto L5 :: bool
  1330. L4:
  1331. r17 = 'matched'
  1332. r18 = builtins :: module
  1333. r19 = 'print'
  1334. r20 = CPyObject_GetAttr(r18, r19)
  1335. r21 = [r17]
  1336. r22 = load_address r21
  1337. r23 = _PyObject_Vectorcall(r20, r22, 1, 0)
  1338. keep_alive r17
  1339. goto L6
  1340. L5:
  1341. L6:
  1342. r24 = box(None, 1)
  1343. return r24
  1344. [case testMatchSequencePatternWithTrailingBoundStar_python3_10]
  1345. def f(x):
  1346. match x:
  1347. case [1, 2, *rest]:
  1348. print("matched")
  1349. [out]
  1350. def f(x):
  1351. x :: object
  1352. r0 :: i32
  1353. r1 :: bit
  1354. r2 :: native_int
  1355. r3, r4 :: bit
  1356. r5, r6, r7 :: object
  1357. r8 :: i32
  1358. r9 :: bit
  1359. r10 :: bool
  1360. r11, r12, r13 :: object
  1361. r14 :: i32
  1362. r15 :: bit
  1363. r16 :: bool
  1364. r17 :: native_int
  1365. r18, rest :: object
  1366. r19 :: str
  1367. r20 :: object
  1368. r21 :: str
  1369. r22 :: object
  1370. r23 :: object[1]
  1371. r24 :: object_ptr
  1372. r25, r26 :: object
  1373. L0:
  1374. r0 = CPySequence_Check(x)
  1375. r1 = r0 != 0
  1376. if r1 goto L1 else goto L6 :: bool
  1377. L1:
  1378. r2 = PyObject_Size(x)
  1379. r3 = r2 >= 0 :: signed
  1380. r4 = r2 >= 2 :: signed
  1381. if r4 goto L2 else goto L6 :: bool
  1382. L2:
  1383. r5 = PySequence_GetItem(x, 0)
  1384. r6 = object 1
  1385. r7 = PyObject_RichCompare(r5, r6, 2)
  1386. r8 = PyObject_IsTrue(r7)
  1387. r9 = r8 >= 0 :: signed
  1388. r10 = truncate r8: i32 to builtins.bool
  1389. if r10 goto L3 else goto L6 :: bool
  1390. L3:
  1391. r11 = PySequence_GetItem(x, 1)
  1392. r12 = object 2
  1393. r13 = PyObject_RichCompare(r11, r12, 2)
  1394. r14 = PyObject_IsTrue(r13)
  1395. r15 = r14 >= 0 :: signed
  1396. r16 = truncate r14: i32 to builtins.bool
  1397. if r16 goto L4 else goto L6 :: bool
  1398. L4:
  1399. r17 = r2 - 0
  1400. r18 = PySequence_GetSlice(x, 2, r17)
  1401. rest = r18
  1402. L5:
  1403. r19 = 'matched'
  1404. r20 = builtins :: module
  1405. r21 = 'print'
  1406. r22 = CPyObject_GetAttr(r20, r21)
  1407. r23 = [r19]
  1408. r24 = load_address r23
  1409. r25 = _PyObject_Vectorcall(r22, r24, 1, 0)
  1410. keep_alive r19
  1411. goto L7
  1412. L6:
  1413. L7:
  1414. r26 = box(None, 1)
  1415. return r26
  1416. [case testMatchSequenceWithStarPatternInTheMiddle_python3_10]
  1417. def f(x):
  1418. match x:
  1419. case ["start", *rest, "end"]:
  1420. print("matched")
  1421. [out]
  1422. def f(x):
  1423. x :: object
  1424. r0 :: i32
  1425. r1 :: bit
  1426. r2 :: native_int
  1427. r3, r4 :: bit
  1428. r5 :: object
  1429. r6 :: str
  1430. r7 :: object
  1431. r8 :: i32
  1432. r9 :: bit
  1433. r10 :: bool
  1434. r11 :: native_int
  1435. r12 :: object
  1436. r13 :: str
  1437. r14 :: object
  1438. r15 :: i32
  1439. r16 :: bit
  1440. r17 :: bool
  1441. r18 :: native_int
  1442. r19, rest :: object
  1443. r20 :: str
  1444. r21 :: object
  1445. r22 :: str
  1446. r23 :: object
  1447. r24 :: object[1]
  1448. r25 :: object_ptr
  1449. r26, r27 :: object
  1450. L0:
  1451. r0 = CPySequence_Check(x)
  1452. r1 = r0 != 0
  1453. if r1 goto L1 else goto L6 :: bool
  1454. L1:
  1455. r2 = PyObject_Size(x)
  1456. r3 = r2 >= 0 :: signed
  1457. r4 = r2 >= 2 :: signed
  1458. if r4 goto L2 else goto L6 :: bool
  1459. L2:
  1460. r5 = PySequence_GetItem(x, 0)
  1461. r6 = 'start'
  1462. r7 = PyObject_RichCompare(r5, r6, 2)
  1463. r8 = PyObject_IsTrue(r7)
  1464. r9 = r8 >= 0 :: signed
  1465. r10 = truncate r8: i32 to builtins.bool
  1466. if r10 goto L3 else goto L6 :: bool
  1467. L3:
  1468. r11 = r2 - 1
  1469. r12 = PySequence_GetItem(x, r11)
  1470. r13 = 'end'
  1471. r14 = PyObject_RichCompare(r12, r13, 2)
  1472. r15 = PyObject_IsTrue(r14)
  1473. r16 = r15 >= 0 :: signed
  1474. r17 = truncate r15: i32 to builtins.bool
  1475. if r17 goto L4 else goto L6 :: bool
  1476. L4:
  1477. r18 = r2 - 1
  1478. r19 = PySequence_GetSlice(x, 1, r18)
  1479. rest = r19
  1480. L5:
  1481. r20 = 'matched'
  1482. r21 = builtins :: module
  1483. r22 = 'print'
  1484. r23 = CPyObject_GetAttr(r21, r22)
  1485. r24 = [r20]
  1486. r25 = load_address r24
  1487. r26 = _PyObject_Vectorcall(r23, r25, 1, 0)
  1488. keep_alive r20
  1489. goto L7
  1490. L6:
  1491. L7:
  1492. r27 = box(None, 1)
  1493. return r27
  1494. [case testMatchSequenceWithStarPatternAtTheStart_python3_10]
  1495. def f(x):
  1496. match x:
  1497. case [*rest, 1, 2]:
  1498. print("matched")
  1499. [out]
  1500. def f(x):
  1501. x :: object
  1502. r0 :: i32
  1503. r1 :: bit
  1504. r2 :: native_int
  1505. r3, r4 :: bit
  1506. r5 :: native_int
  1507. r6, r7, r8 :: object
  1508. r9 :: i32
  1509. r10 :: bit
  1510. r11 :: bool
  1511. r12 :: native_int
  1512. r13, r14, r15 :: object
  1513. r16 :: i32
  1514. r17 :: bit
  1515. r18 :: bool
  1516. r19 :: native_int
  1517. r20, rest :: object
  1518. r21 :: str
  1519. r22 :: object
  1520. r23 :: str
  1521. r24 :: object
  1522. r25 :: object[1]
  1523. r26 :: object_ptr
  1524. r27, r28 :: object
  1525. L0:
  1526. r0 = CPySequence_Check(x)
  1527. r1 = r0 != 0
  1528. if r1 goto L1 else goto L6 :: bool
  1529. L1:
  1530. r2 = PyObject_Size(x)
  1531. r3 = r2 >= 0 :: signed
  1532. r4 = r2 >= 2 :: signed
  1533. if r4 goto L2 else goto L6 :: bool
  1534. L2:
  1535. r5 = r2 - 2
  1536. r6 = PySequence_GetItem(x, r5)
  1537. r7 = object 1
  1538. r8 = PyObject_RichCompare(r6, r7, 2)
  1539. r9 = PyObject_IsTrue(r8)
  1540. r10 = r9 >= 0 :: signed
  1541. r11 = truncate r9: i32 to builtins.bool
  1542. if r11 goto L3 else goto L6 :: bool
  1543. L3:
  1544. r12 = r2 - 1
  1545. r13 = PySequence_GetItem(x, r12)
  1546. r14 = object 2
  1547. r15 = PyObject_RichCompare(r13, r14, 2)
  1548. r16 = PyObject_IsTrue(r15)
  1549. r17 = r16 >= 0 :: signed
  1550. r18 = truncate r16: i32 to builtins.bool
  1551. if r18 goto L4 else goto L6 :: bool
  1552. L4:
  1553. r19 = r2 - 2
  1554. r20 = PySequence_GetSlice(x, 0, r19)
  1555. rest = r20
  1556. L5:
  1557. r21 = 'matched'
  1558. r22 = builtins :: module
  1559. r23 = 'print'
  1560. r24 = CPyObject_GetAttr(r22, r23)
  1561. r25 = [r21]
  1562. r26 = load_address r25
  1563. r27 = _PyObject_Vectorcall(r24, r26, 1, 0)
  1564. keep_alive r21
  1565. goto L7
  1566. L6:
  1567. L7:
  1568. r28 = box(None, 1)
  1569. return r28
  1570. [case testMatchBuiltinClassPattern_python3_10]
  1571. def f(x):
  1572. match x:
  1573. case int(y):
  1574. print("matched")
  1575. [out]
  1576. def f(x):
  1577. x, r0 :: object
  1578. r1 :: bool
  1579. r2, y :: int
  1580. r3 :: str
  1581. r4 :: object
  1582. r5 :: str
  1583. r6 :: object
  1584. r7 :: object[1]
  1585. r8 :: object_ptr
  1586. r9, r10 :: object
  1587. L0:
  1588. r0 = load_address PyLong_Type
  1589. r1 = CPy_TypeCheck(x, r0)
  1590. if r1 goto L1 else goto L3 :: bool
  1591. L1:
  1592. r2 = unbox(int, x)
  1593. y = r2
  1594. L2:
  1595. r3 = 'matched'
  1596. r4 = builtins :: module
  1597. r5 = 'print'
  1598. r6 = CPyObject_GetAttr(r4, r5)
  1599. r7 = [r3]
  1600. r8 = load_address r7
  1601. r9 = _PyObject_Vectorcall(r6, r8, 1, 0)
  1602. keep_alive r3
  1603. goto L4
  1604. L3:
  1605. L4:
  1606. r10 = box(None, 1)
  1607. return r10
  1608. [case testMatchSequenceCaptureAll_python3_10]
  1609. def f(x):
  1610. match x:
  1611. case [*rest]:
  1612. print("matched")
  1613. [out]
  1614. def f(x):
  1615. x :: object
  1616. r0 :: i32
  1617. r1 :: bit
  1618. r2 :: native_int
  1619. r3, r4 :: bit
  1620. r5 :: native_int
  1621. r6, rest :: object
  1622. r7 :: str
  1623. r8 :: object
  1624. r9 :: str
  1625. r10 :: object
  1626. r11 :: object[1]
  1627. r12 :: object_ptr
  1628. r13, r14 :: object
  1629. L0:
  1630. r0 = CPySequence_Check(x)
  1631. r1 = r0 != 0
  1632. if r1 goto L1 else goto L4 :: bool
  1633. L1:
  1634. r2 = PyObject_Size(x)
  1635. r3 = r2 >= 0 :: signed
  1636. r4 = r2 >= 0 :: signed
  1637. if r4 goto L2 else goto L4 :: bool
  1638. L2:
  1639. r5 = r2 - 0
  1640. r6 = PySequence_GetSlice(x, 0, r5)
  1641. rest = r6
  1642. L3:
  1643. r7 = 'matched'
  1644. r8 = builtins :: module
  1645. r9 = 'print'
  1646. r10 = CPyObject_GetAttr(r8, r9)
  1647. r11 = [r7]
  1648. r12 = load_address r11
  1649. r13 = _PyObject_Vectorcall(r10, r12, 1, 0)
  1650. keep_alive r7
  1651. goto L5
  1652. L4:
  1653. L5:
  1654. r14 = box(None, 1)
  1655. return r14
  1656. [case testMatchTypeAnnotatedNativeClass_python3_10]
  1657. class A:
  1658. a: int
  1659. def f(x: A | int) -> int:
  1660. match x:
  1661. case A(a=a):
  1662. return a
  1663. case int():
  1664. return x
  1665. [out]
  1666. def f(x):
  1667. x :: union[__main__.A, int]
  1668. r0 :: object
  1669. r1 :: i32
  1670. r2 :: bit
  1671. r3 :: bool
  1672. r4 :: str
  1673. r5 :: object
  1674. r6, a :: int
  1675. r7 :: object
  1676. r8 :: bool
  1677. r9 :: int
  1678. L0:
  1679. r0 = __main__.A :: type
  1680. r1 = PyObject_IsInstance(x, r0)
  1681. r2 = r1 >= 0 :: signed
  1682. r3 = truncate r1: i32 to builtins.bool
  1683. if r3 goto L1 else goto L3 :: bool
  1684. L1:
  1685. r4 = 'a'
  1686. r5 = CPyObject_GetAttr(x, r4)
  1687. r6 = unbox(int, r5)
  1688. a = r6
  1689. L2:
  1690. return a
  1691. L3:
  1692. r7 = load_address PyLong_Type
  1693. r8 = CPy_TypeCheck(x, r7)
  1694. if r8 goto L4 else goto L5 :: bool
  1695. L4:
  1696. r9 = unbox(int, x)
  1697. return r9
  1698. L5:
  1699. L6:
  1700. unreachable