irbuild-dict.test 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. [case testDictGet]
  2. from typing import Dict
  3. def f(d: Dict[int, bool]) -> bool:
  4. return d[0]
  5. [out]
  6. def f(d):
  7. d :: dict
  8. r0, r1 :: object
  9. r2 :: bool
  10. L0:
  11. r0 = object 0
  12. r1 = CPyDict_GetItem(d, r0)
  13. r2 = unbox(bool, r1)
  14. return r2
  15. [case testDictSet]
  16. from typing import Dict
  17. def f(d: Dict[int, bool]) -> None:
  18. d[0] = False
  19. [out]
  20. def f(d):
  21. d :: dict
  22. r0, r1 :: object
  23. r2 :: int32
  24. r3 :: bit
  25. L0:
  26. r0 = object 0
  27. r1 = box(bool, 0)
  28. r2 = CPyDict_SetItem(d, r0, r1)
  29. r3 = r2 >= 0 :: signed
  30. return 1
  31. [case testNewEmptyDict]
  32. from typing import Dict
  33. def f() -> None:
  34. d = {} # type: Dict[bool, int]
  35. [out]
  36. def f():
  37. r0, d :: dict
  38. L0:
  39. r0 = PyDict_New()
  40. d = r0
  41. return 1
  42. [case testNewEmptyDictViaFunc]
  43. from typing import Dict
  44. def f() -> None:
  45. d: Dict[bool, int] = dict()
  46. [out]
  47. def f():
  48. r0, d :: dict
  49. L0:
  50. r0 = PyDict_New()
  51. d = r0
  52. return 1
  53. [case testNewDictWithValues]
  54. def f(x: object) -> None:
  55. d = {1: 2, '': x}
  56. [out]
  57. def f(x):
  58. x :: object
  59. r0 :: str
  60. r1, r2 :: object
  61. r3, d :: dict
  62. L0:
  63. r0 = ''
  64. r1 = object 1
  65. r2 = object 2
  66. r3 = CPyDict_Build(2, r1, r2, r0, x)
  67. d = r3
  68. return 1
  69. [case testInDict]
  70. from typing import Dict
  71. def f(d: Dict[int, int]) -> bool:
  72. if 4 in d:
  73. return True
  74. else:
  75. return False
  76. [out]
  77. def f(d):
  78. d :: dict
  79. r0 :: object
  80. r1 :: int32
  81. r2 :: bit
  82. r3 :: bool
  83. L0:
  84. r0 = object 4
  85. r1 = PyDict_Contains(d, r0)
  86. r2 = r1 >= 0 :: signed
  87. r3 = truncate r1: int32 to builtins.bool
  88. if r3 goto L1 else goto L2 :: bool
  89. L1:
  90. return 1
  91. L2:
  92. return 0
  93. L3:
  94. unreachable
  95. [case testNotInDict]
  96. from typing import Dict
  97. def f(d: Dict[int, int]) -> bool:
  98. if 4 not in d:
  99. return True
  100. else:
  101. return False
  102. [out]
  103. def f(d):
  104. d :: dict
  105. r0 :: object
  106. r1 :: int32
  107. r2 :: bit
  108. r3, r4 :: bool
  109. L0:
  110. r0 = object 4
  111. r1 = PyDict_Contains(d, r0)
  112. r2 = r1 >= 0 :: signed
  113. r3 = truncate r1: int32 to builtins.bool
  114. r4 = r3 ^ 1
  115. if r4 goto L1 else goto L2 :: bool
  116. L1:
  117. return 1
  118. L2:
  119. return 0
  120. L3:
  121. unreachable
  122. [case testDictUpdate]
  123. from typing import Dict
  124. def f(a: Dict[int, int], b: Dict[int, int]) -> None:
  125. a.update(b)
  126. [out]
  127. def f(a, b):
  128. a, b :: dict
  129. r0 :: int32
  130. r1 :: bit
  131. L0:
  132. r0 = CPyDict_Update(a, b)
  133. r1 = r0 >= 0 :: signed
  134. return 1
  135. [case testDictKeyLvalue]
  136. from typing import Dict
  137. def increment(d: Dict[str, int]) -> Dict[str, int]:
  138. for k in d:
  139. d[k] += 1
  140. return d
  141. [out]
  142. def increment(d):
  143. d :: dict
  144. r0 :: short_int
  145. r1 :: native_int
  146. r2 :: short_int
  147. r3 :: object
  148. r4 :: tuple[bool, short_int, object]
  149. r5 :: short_int
  150. r6 :: bool
  151. r7 :: object
  152. r8, k :: str
  153. r9, r10, r11 :: object
  154. r12 :: int32
  155. r13, r14, r15 :: bit
  156. L0:
  157. r0 = 0
  158. r1 = PyDict_Size(d)
  159. r2 = r1 << 1
  160. r3 = CPyDict_GetKeysIter(d)
  161. L1:
  162. r4 = CPyDict_NextKey(r3, r0)
  163. r5 = r4[1]
  164. r0 = r5
  165. r6 = r4[0]
  166. if r6 goto L2 else goto L4 :: bool
  167. L2:
  168. r7 = r4[2]
  169. r8 = cast(str, r7)
  170. k = r8
  171. r9 = CPyDict_GetItem(d, k)
  172. r10 = object 1
  173. r11 = PyNumber_InPlaceAdd(r9, r10)
  174. r12 = CPyDict_SetItem(d, k, r11)
  175. r13 = r12 >= 0 :: signed
  176. L3:
  177. r14 = CPyDict_CheckSize(d, r2)
  178. goto L1
  179. L4:
  180. r15 = CPy_NoErrOccured()
  181. L5:
  182. return d
  183. [case testDictDisplay]
  184. from typing import Dict
  185. def f(x: str, y: Dict[str, int]) -> Dict[str, int]:
  186. return {x: 2, **y, 'z': 3}
  187. [out]
  188. def f(x, y):
  189. x :: str
  190. y :: dict
  191. r0 :: str
  192. r1 :: object
  193. r2 :: dict
  194. r3 :: int32
  195. r4 :: bit
  196. r5 :: object
  197. r6 :: int32
  198. r7 :: bit
  199. L0:
  200. r0 = 'z'
  201. r1 = object 2
  202. r2 = CPyDict_Build(1, x, r1)
  203. r3 = CPyDict_UpdateInDisplay(r2, y)
  204. r4 = r3 >= 0 :: signed
  205. r5 = object 3
  206. r6 = CPyDict_SetItem(r2, r0, r5)
  207. r7 = r6 >= 0 :: signed
  208. return r2
  209. [case testDictIterationMethods]
  210. from typing import Dict, Union
  211. from typing_extensions import TypedDict
  212. class Person(TypedDict):
  213. name: str
  214. age: int
  215. def print_dict_methods(d1: Dict[int, int], d2: Dict[int, int]) -> None:
  216. for v in d1.values():
  217. if v in d2:
  218. return
  219. for k, v in d2.items():
  220. d2[k] += v
  221. def union_of_dicts(d: Union[Dict[str, int], Dict[str, str]]) -> None:
  222. new = {}
  223. for k, v in d.items():
  224. new[k] = int(v)
  225. def typeddict(d: Person) -> None:
  226. for k, v in d.items():
  227. if k == "name":
  228. name = v
  229. [out]
  230. def print_dict_methods(d1, d2):
  231. d1, d2 :: dict
  232. r0 :: short_int
  233. r1 :: native_int
  234. r2 :: short_int
  235. r3 :: object
  236. r4 :: tuple[bool, short_int, object]
  237. r5 :: short_int
  238. r6 :: bool
  239. r7 :: object
  240. r8, v :: int
  241. r9 :: object
  242. r10 :: int32
  243. r11 :: bit
  244. r12 :: bool
  245. r13, r14 :: bit
  246. r15 :: short_int
  247. r16 :: native_int
  248. r17 :: short_int
  249. r18 :: object
  250. r19 :: tuple[bool, short_int, object, object]
  251. r20 :: short_int
  252. r21 :: bool
  253. r22, r23 :: object
  254. r24, r25, k :: int
  255. r26, r27, r28, r29, r30 :: object
  256. r31 :: int32
  257. r32, r33, r34 :: bit
  258. L0:
  259. r0 = 0
  260. r1 = PyDict_Size(d1)
  261. r2 = r1 << 1
  262. r3 = CPyDict_GetValuesIter(d1)
  263. L1:
  264. r4 = CPyDict_NextValue(r3, r0)
  265. r5 = r4[1]
  266. r0 = r5
  267. r6 = r4[0]
  268. if r6 goto L2 else goto L6 :: bool
  269. L2:
  270. r7 = r4[2]
  271. r8 = unbox(int, r7)
  272. v = r8
  273. r9 = box(int, v)
  274. r10 = PyDict_Contains(d2, r9)
  275. r11 = r10 >= 0 :: signed
  276. r12 = truncate r10: int32 to builtins.bool
  277. if r12 goto L3 else goto L4 :: bool
  278. L3:
  279. return 1
  280. L4:
  281. L5:
  282. r13 = CPyDict_CheckSize(d1, r2)
  283. goto L1
  284. L6:
  285. r14 = CPy_NoErrOccured()
  286. L7:
  287. r15 = 0
  288. r16 = PyDict_Size(d2)
  289. r17 = r16 << 1
  290. r18 = CPyDict_GetItemsIter(d2)
  291. L8:
  292. r19 = CPyDict_NextItem(r18, r15)
  293. r20 = r19[1]
  294. r15 = r20
  295. r21 = r19[0]
  296. if r21 goto L9 else goto L11 :: bool
  297. L9:
  298. r22 = r19[2]
  299. r23 = r19[3]
  300. r24 = unbox(int, r22)
  301. r25 = unbox(int, r23)
  302. k = r24
  303. v = r25
  304. r26 = box(int, k)
  305. r27 = CPyDict_GetItem(d2, r26)
  306. r28 = box(int, v)
  307. r29 = PyNumber_InPlaceAdd(r27, r28)
  308. r30 = box(int, k)
  309. r31 = CPyDict_SetItem(d2, r30, r29)
  310. r32 = r31 >= 0 :: signed
  311. L10:
  312. r33 = CPyDict_CheckSize(d2, r17)
  313. goto L8
  314. L11:
  315. r34 = CPy_NoErrOccured()
  316. L12:
  317. return 1
  318. def union_of_dicts(d):
  319. d, r0, new :: dict
  320. r1 :: short_int
  321. r2 :: native_int
  322. r3 :: short_int
  323. r4 :: object
  324. r5 :: tuple[bool, short_int, object, object]
  325. r6 :: short_int
  326. r7 :: bool
  327. r8, r9 :: object
  328. r10 :: str
  329. r11 :: union[int, str]
  330. k :: str
  331. v :: union[int, str]
  332. r12, r13 :: object
  333. r14 :: int
  334. r15 :: object
  335. r16 :: int32
  336. r17, r18, r19 :: bit
  337. L0:
  338. r0 = PyDict_New()
  339. new = r0
  340. r1 = 0
  341. r2 = PyDict_Size(d)
  342. r3 = r2 << 1
  343. r4 = CPyDict_GetItemsIter(d)
  344. L1:
  345. r5 = CPyDict_NextItem(r4, r1)
  346. r6 = r5[1]
  347. r1 = r6
  348. r7 = r5[0]
  349. if r7 goto L2 else goto L4 :: bool
  350. L2:
  351. r8 = r5[2]
  352. r9 = r5[3]
  353. r10 = cast(str, r8)
  354. r11 = cast(union[int, str], r9)
  355. k = r10
  356. v = r11
  357. r12 = load_address PyLong_Type
  358. r13 = PyObject_CallFunctionObjArgs(r12, v, 0)
  359. r14 = unbox(int, r13)
  360. r15 = box(int, r14)
  361. r16 = CPyDict_SetItem(new, k, r15)
  362. r17 = r16 >= 0 :: signed
  363. L3:
  364. r18 = CPyDict_CheckSize(d, r3)
  365. goto L1
  366. L4:
  367. r19 = CPy_NoErrOccured()
  368. L5:
  369. return 1
  370. def typeddict(d):
  371. d :: dict
  372. r0 :: short_int
  373. r1 :: native_int
  374. r2 :: short_int
  375. r3 :: object
  376. r4 :: tuple[bool, short_int, object, object]
  377. r5 :: short_int
  378. r6 :: bool
  379. r7, r8 :: object
  380. r9, k :: str
  381. v :: object
  382. r10 :: str
  383. r11 :: int32
  384. r12 :: bit
  385. r13 :: object
  386. r14, r15, r16 :: bit
  387. name :: object
  388. r17, r18 :: bit
  389. L0:
  390. r0 = 0
  391. r1 = PyDict_Size(d)
  392. r2 = r1 << 1
  393. r3 = CPyDict_GetItemsIter(d)
  394. L1:
  395. r4 = CPyDict_NextItem(r3, r0)
  396. r5 = r4[1]
  397. r0 = r5
  398. r6 = r4[0]
  399. if r6 goto L2 else goto L9 :: bool
  400. L2:
  401. r7 = r4[2]
  402. r8 = r4[3]
  403. r9 = cast(str, r7)
  404. k = r9
  405. v = r8
  406. r10 = 'name'
  407. r11 = PyUnicode_Compare(k, r10)
  408. r12 = r11 == -1
  409. if r12 goto L3 else goto L5 :: bool
  410. L3:
  411. r13 = PyErr_Occurred()
  412. r14 = r13 != 0
  413. if r14 goto L4 else goto L5 :: bool
  414. L4:
  415. r15 = CPy_KeepPropagating()
  416. L5:
  417. r16 = r11 == 0
  418. if r16 goto L6 else goto L7 :: bool
  419. L6:
  420. name = v
  421. L7:
  422. L8:
  423. r17 = CPyDict_CheckSize(d, r2)
  424. goto L1
  425. L9:
  426. r18 = CPy_NoErrOccured()
  427. L10:
  428. return 1
  429. [case testDictLoadAddress]
  430. def f() -> None:
  431. x = dict
  432. [out]
  433. def f():
  434. r0, x :: object
  435. L0:
  436. r0 = load_address PyDict_Type
  437. x = r0
  438. return 1
  439. [case testDictClear]
  440. from typing import Dict
  441. def f(d: Dict[int, int]) -> None:
  442. return d.clear()
  443. [out]
  444. def f(d):
  445. d :: dict
  446. r0 :: bit
  447. L0:
  448. r0 = CPyDict_Clear(d)
  449. return 1
  450. [case testDictCopy]
  451. from typing import Dict
  452. def f(d: Dict[int, int]) -> Dict[int, int]:
  453. return d.copy()
  454. [out]
  455. def f(d):
  456. d, r0 :: dict
  457. L0:
  458. r0 = CPyDict_Copy(d)
  459. return r0
  460. [case testDictSetdefault]
  461. from typing import Dict
  462. def f(d: Dict[object, object]) -> object:
  463. return d.setdefault('a', 'b')
  464. def f2(d: Dict[object, object], flag: bool) -> object:
  465. if flag:
  466. return d.setdefault('a', set())
  467. else:
  468. return d.setdefault('a', set('b'))
  469. def f3(d: Dict[object, object], flag: bool) -> object:
  470. if flag:
  471. return d.setdefault('a', [])
  472. else:
  473. return d.setdefault('a', [1])
  474. def f4(d: Dict[object, object], flag: bool) -> object:
  475. if flag:
  476. return d.setdefault('a', {})
  477. else:
  478. return d.setdefault('a', {'c': 1})
  479. [out]
  480. def f(d):
  481. d :: dict
  482. r0, r1 :: str
  483. r2 :: object
  484. L0:
  485. r0 = 'a'
  486. r1 = 'b'
  487. r2 = CPyDict_SetDefault(d, r0, r1)
  488. return r2
  489. def f2(d, flag):
  490. d :: dict
  491. flag :: bool
  492. r0 :: str
  493. r1 :: object
  494. r2, r3 :: str
  495. r4 :: set
  496. r5, r6 :: object
  497. L0:
  498. if flag goto L1 else goto L2 :: bool
  499. L1:
  500. r0 = 'a'
  501. r1 = CPyDict_SetDefaultWithEmptyDatatype(d, r0, 3)
  502. return r1
  503. L2:
  504. r2 = 'a'
  505. r3 = 'b'
  506. r4 = PySet_New(r3)
  507. r5 = CPyDict_SetDefault(d, r2, r4)
  508. return r5
  509. L3:
  510. r6 = box(None, 1)
  511. return r6
  512. def f3(d, flag):
  513. d :: dict
  514. flag :: bool
  515. r0 :: str
  516. r1 :: object
  517. r2 :: str
  518. r3 :: list
  519. r4 :: object
  520. r5, r6 :: ptr
  521. r7, r8 :: object
  522. L0:
  523. if flag goto L1 else goto L2 :: bool
  524. L1:
  525. r0 = 'a'
  526. r1 = CPyDict_SetDefaultWithEmptyDatatype(d, r0, 1)
  527. return r1
  528. L2:
  529. r2 = 'a'
  530. r3 = PyList_New(1)
  531. r4 = object 1
  532. r5 = get_element_ptr r3 ob_item :: PyListObject
  533. r6 = load_mem r5 :: ptr*
  534. set_mem r6, r4 :: builtins.object*
  535. keep_alive r3
  536. r7 = CPyDict_SetDefault(d, r2, r3)
  537. return r7
  538. L3:
  539. r8 = box(None, 1)
  540. return r8
  541. def f4(d, flag):
  542. d :: dict
  543. flag :: bool
  544. r0 :: str
  545. r1 :: object
  546. r2, r3 :: str
  547. r4 :: object
  548. r5 :: dict
  549. r6, r7 :: object
  550. L0:
  551. if flag goto L1 else goto L2 :: bool
  552. L1:
  553. r0 = 'a'
  554. r1 = CPyDict_SetDefaultWithEmptyDatatype(d, r0, 2)
  555. return r1
  556. L2:
  557. r2 = 'a'
  558. r3 = 'c'
  559. r4 = object 1
  560. r5 = CPyDict_Build(1, r3, r4)
  561. r6 = CPyDict_SetDefault(d, r2, r5)
  562. return r6
  563. L3:
  564. r7 = box(None, 1)
  565. return r7