irbuild-bool.test 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. [case testBoolToAndFromInt]
  2. from mypy_extensions import i64
  3. def bool_to_int(b: bool) -> int:
  4. return b
  5. def int_to_bool(n: int) -> bool:
  6. return bool(n)
  7. def bool_to_i64(b: bool) -> i64:
  8. return b
  9. def i64_to_bool(n: i64) -> bool:
  10. return bool(n)
  11. def bit_to_int(n1: i64, n2: i64) -> int:
  12. return bool(n1 == n2)
  13. def bit_to_i64(n1: i64, n2: i64) -> i64:
  14. return bool(n1 == n2)
  15. [out]
  16. def bool_to_int(b):
  17. b, r0 :: bool
  18. r1 :: int
  19. L0:
  20. r0 = b << 1
  21. r1 = extend r0: builtins.bool to builtins.int
  22. return r1
  23. def int_to_bool(n):
  24. n :: int
  25. r0 :: bit
  26. L0:
  27. r0 = n != 0
  28. return r0
  29. def bool_to_i64(b):
  30. b :: bool
  31. r0 :: i64
  32. L0:
  33. r0 = extend b: builtins.bool to i64
  34. return r0
  35. def i64_to_bool(n):
  36. n :: i64
  37. r0 :: bit
  38. L0:
  39. r0 = n != 0
  40. return r0
  41. def bit_to_int(n1, n2):
  42. n1, n2 :: i64
  43. r0 :: bit
  44. r1 :: bool
  45. r2 :: int
  46. L0:
  47. r0 = n1 == n2
  48. r1 = r0 << 1
  49. r2 = extend r1: builtins.bool to builtins.int
  50. return r2
  51. def bit_to_i64(n1, n2):
  52. n1, n2 :: i64
  53. r0 :: bit
  54. r1 :: i64
  55. L0:
  56. r0 = n1 == n2
  57. r1 = extend r0: bit to i64
  58. return r1
  59. [case testConversionToBool]
  60. from typing import List, Optional
  61. class C: pass
  62. class D:
  63. def __bool__(self) -> bool:
  64. return True
  65. def list_to_bool(l: List[str]) -> bool:
  66. return bool(l)
  67. def always_truthy_instance_to_bool(o: C) -> bool:
  68. return bool(o)
  69. def instance_to_bool(o: D) -> bool:
  70. return bool(o)
  71. def optional_truthy_to_bool(o: Optional[C]) -> bool:
  72. return bool(o)
  73. def optional_maybe_falsey_to_bool(o: Optional[D]) -> bool:
  74. return bool(o)
  75. [out]
  76. def D.__bool__(self):
  77. self :: __main__.D
  78. L0:
  79. return 1
  80. def list_to_bool(l):
  81. l :: list
  82. r0 :: ptr
  83. r1 :: native_int
  84. r2 :: short_int
  85. r3 :: bit
  86. L0:
  87. r0 = get_element_ptr l ob_size :: PyVarObject
  88. r1 = load_mem r0 :: native_int*
  89. keep_alive l
  90. r2 = r1 << 1
  91. r3 = r2 != 0
  92. return r3
  93. def always_truthy_instance_to_bool(o):
  94. o :: __main__.C
  95. r0 :: i32
  96. r1 :: bit
  97. r2 :: bool
  98. L0:
  99. r0 = PyObject_IsTrue(o)
  100. r1 = r0 >= 0 :: signed
  101. r2 = truncate r0: i32 to builtins.bool
  102. return r2
  103. def instance_to_bool(o):
  104. o :: __main__.D
  105. r0 :: bool
  106. L0:
  107. r0 = o.__bool__()
  108. return r0
  109. def optional_truthy_to_bool(o):
  110. o :: union[__main__.C, None]
  111. r0 :: object
  112. r1 :: bit
  113. L0:
  114. r0 = load_address _Py_NoneStruct
  115. r1 = o != r0
  116. return r1
  117. def optional_maybe_falsey_to_bool(o):
  118. o :: union[__main__.D, None]
  119. r0 :: object
  120. r1 :: bit
  121. r2 :: __main__.D
  122. r3 :: bool
  123. r4 :: bit
  124. L0:
  125. r0 = load_address _Py_NoneStruct
  126. r1 = o != r0
  127. if r1 goto L1 else goto L2 :: bool
  128. L1:
  129. r2 = cast(__main__.D, o)
  130. r3 = r2.__bool__()
  131. r4 = r3
  132. goto L3
  133. L2:
  134. r4 = 0
  135. L3:
  136. return r4
  137. [case testBoolComparisons]
  138. def eq(x: bool, y: bool) -> bool:
  139. return x == y
  140. def neq(x: bool, y: bool) -> bool:
  141. return x != y
  142. def lt(x: bool, y: bool) -> bool:
  143. return x < y
  144. def le(x: bool, y: bool) -> bool:
  145. return x <= y
  146. def gt(x: bool, y: bool) -> bool:
  147. return x > y
  148. def ge(x: bool, y: bool) -> bool:
  149. return x >= y
  150. [out]
  151. def eq(x, y):
  152. x, y :: bool
  153. r0 :: bit
  154. L0:
  155. r0 = x == y
  156. return r0
  157. def neq(x, y):
  158. x, y :: bool
  159. r0 :: bit
  160. L0:
  161. r0 = x != y
  162. return r0
  163. def lt(x, y):
  164. x, y :: bool
  165. r0 :: bit
  166. L0:
  167. r0 = x < y :: signed
  168. return r0
  169. def le(x, y):
  170. x, y :: bool
  171. r0 :: bit
  172. L0:
  173. r0 = x <= y :: signed
  174. return r0
  175. def gt(x, y):
  176. x, y :: bool
  177. r0 :: bit
  178. L0:
  179. r0 = x > y :: signed
  180. return r0
  181. def ge(x, y):
  182. x, y :: bool
  183. r0 :: bit
  184. L0:
  185. r0 = x >= y :: signed
  186. return r0
  187. [case testBoolMixedComparisons1]
  188. from mypy_extensions import i64
  189. def eq1(x: int, y: bool) -> bool:
  190. return x == y
  191. def eq2(x: bool, y: int) -> bool:
  192. return x == y
  193. def neq1(x: i64, y: bool) -> bool:
  194. return x != y
  195. def neq2(x: bool, y: i64) -> bool:
  196. return x != y
  197. [out]
  198. def eq1(x, y):
  199. x :: int
  200. y, r0 :: bool
  201. r1 :: int
  202. r2 :: bit
  203. L0:
  204. r0 = y << 1
  205. r1 = extend r0: builtins.bool to builtins.int
  206. r2 = x == r1
  207. return r2
  208. def eq2(x, y):
  209. x :: bool
  210. y :: int
  211. r0 :: bool
  212. r1 :: int
  213. r2 :: bit
  214. L0:
  215. r0 = x << 1
  216. r1 = extend r0: builtins.bool to builtins.int
  217. r2 = r1 == y
  218. return r2
  219. def neq1(x, y):
  220. x :: i64
  221. y :: bool
  222. r0 :: i64
  223. r1 :: bit
  224. L0:
  225. r0 = extend y: builtins.bool to i64
  226. r1 = x != r0
  227. return r1
  228. def neq2(x, y):
  229. x :: bool
  230. y, r0 :: i64
  231. r1 :: bit
  232. L0:
  233. r0 = extend x: builtins.bool to i64
  234. r1 = r0 != y
  235. return r1
  236. [case testBoolMixedComparisons2]
  237. from mypy_extensions import i64
  238. def lt1(x: bool, y: int) -> bool:
  239. return x < y
  240. def lt2(x: int, y: bool) -> bool:
  241. return x < y
  242. def gt1(x: bool, y: i64) -> bool:
  243. return x < y
  244. def gt2(x: i64, y: bool) -> bool:
  245. return x < y
  246. [out]
  247. def lt1(x, y):
  248. x :: bool
  249. y :: int
  250. r0 :: bool
  251. r1 :: short_int
  252. r2 :: native_int
  253. r3 :: bit
  254. r4 :: native_int
  255. r5, r6, r7 :: bit
  256. r8 :: bool
  257. r9 :: bit
  258. L0:
  259. r0 = x << 1
  260. r1 = extend r0: builtins.bool to short_int
  261. r2 = r1 & 1
  262. r3 = r2 == 0
  263. r4 = y & 1
  264. r5 = r4 == 0
  265. r6 = r3 & r5
  266. if r6 goto L1 else goto L2 :: bool
  267. L1:
  268. r7 = r1 < y :: signed
  269. r8 = r7
  270. goto L3
  271. L2:
  272. r9 = CPyTagged_IsLt_(r1, y)
  273. r8 = r9
  274. L3:
  275. return r8
  276. def lt2(x, y):
  277. x :: int
  278. y, r0 :: bool
  279. r1 :: short_int
  280. r2 :: native_int
  281. r3 :: bit
  282. r4 :: native_int
  283. r5, r6, r7 :: bit
  284. r8 :: bool
  285. r9 :: bit
  286. L0:
  287. r0 = y << 1
  288. r1 = extend r0: builtins.bool to short_int
  289. r2 = x & 1
  290. r3 = r2 == 0
  291. r4 = r1 & 1
  292. r5 = r4 == 0
  293. r6 = r3 & r5
  294. if r6 goto L1 else goto L2 :: bool
  295. L1:
  296. r7 = x < r1 :: signed
  297. r8 = r7
  298. goto L3
  299. L2:
  300. r9 = CPyTagged_IsLt_(x, r1)
  301. r8 = r9
  302. L3:
  303. return r8
  304. def gt1(x, y):
  305. x :: bool
  306. y, r0 :: i64
  307. r1 :: bit
  308. L0:
  309. r0 = extend x: builtins.bool to i64
  310. r1 = r0 < y :: signed
  311. return r1
  312. def gt2(x, y):
  313. x :: i64
  314. y :: bool
  315. r0 :: i64
  316. r1 :: bit
  317. L0:
  318. r0 = extend y: builtins.bool to i64
  319. r1 = x < r0 :: signed
  320. return r1
  321. [case testBoolBitwise]
  322. from mypy_extensions import i64
  323. def bitand(x: bool, y: bool) -> bool:
  324. b = x & y
  325. return b
  326. def bitor(x: bool, y: bool) -> bool:
  327. b = x | y
  328. return b
  329. def bitxor(x: bool, y: bool) -> bool:
  330. b = x ^ y
  331. return b
  332. def invert(x: bool) -> int:
  333. return ~x
  334. def mixed_bitand(x: i64, y: bool) -> i64:
  335. return x & y
  336. [out]
  337. def bitand(x, y):
  338. x, y, r0, b :: bool
  339. L0:
  340. r0 = x & y
  341. b = r0
  342. return b
  343. def bitor(x, y):
  344. x, y, r0, b :: bool
  345. L0:
  346. r0 = x | y
  347. b = r0
  348. return b
  349. def bitxor(x, y):
  350. x, y, r0, b :: bool
  351. L0:
  352. r0 = x ^ y
  353. b = r0
  354. return b
  355. def invert(x):
  356. x, r0 :: bool
  357. r1, r2 :: int
  358. L0:
  359. r0 = x << 1
  360. r1 = extend r0: builtins.bool to builtins.int
  361. r2 = CPyTagged_Invert(r1)
  362. return r2
  363. def mixed_bitand(x, y):
  364. x :: i64
  365. y :: bool
  366. r0, r1 :: i64
  367. L0:
  368. r0 = extend y: builtins.bool to i64
  369. r1 = x & r0
  370. return r1
  371. [case testBoolArithmetic]
  372. def add(x: bool, y: bool) -> int:
  373. z = x + y
  374. return z
  375. def mixed(b: bool, n: int) -> int:
  376. z = b + n
  377. z -= b
  378. z = z * b
  379. return z
  380. def negate(b: bool) -> int:
  381. return -b
  382. def unary_plus(b: bool) -> int:
  383. x = +b
  384. return x
  385. [out]
  386. def add(x, y):
  387. x, y, r0 :: bool
  388. r1 :: int
  389. r2 :: bool
  390. r3, r4, z :: int
  391. L0:
  392. r0 = x << 1
  393. r1 = extend r0: builtins.bool to builtins.int
  394. r2 = y << 1
  395. r3 = extend r2: builtins.bool to builtins.int
  396. r4 = CPyTagged_Add(r1, r3)
  397. z = r4
  398. return z
  399. def mixed(b, n):
  400. b :: bool
  401. n :: int
  402. r0 :: bool
  403. r1, r2, z :: int
  404. r3 :: bool
  405. r4, r5 :: int
  406. r6 :: bool
  407. r7, r8 :: int
  408. L0:
  409. r0 = b << 1
  410. r1 = extend r0: builtins.bool to builtins.int
  411. r2 = CPyTagged_Add(r1, n)
  412. z = r2
  413. r3 = b << 1
  414. r4 = extend r3: builtins.bool to builtins.int
  415. r5 = CPyTagged_Subtract(z, r4)
  416. z = r5
  417. r6 = b << 1
  418. r7 = extend r6: builtins.bool to builtins.int
  419. r8 = CPyTagged_Multiply(z, r7)
  420. z = r8
  421. return z
  422. def negate(b):
  423. b, r0 :: bool
  424. r1, r2 :: int
  425. L0:
  426. r0 = b << 1
  427. r1 = extend r0: builtins.bool to builtins.int
  428. r2 = CPyTagged_Negate(r1)
  429. return r2
  430. def unary_plus(b):
  431. b, r0 :: bool
  432. r1, x :: int
  433. L0:
  434. r0 = b << 1
  435. r1 = extend r0: builtins.bool to builtins.int
  436. x = r1
  437. return x