irbuild-nested.test 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. [case testNestedFunctions]
  2. from typing import Callable
  3. def a() -> Callable[[], object]:
  4. def inner() -> object:
  5. return None
  6. return inner
  7. def b() -> Callable[[], Callable[[], str]]:
  8. def first() -> Callable[[], str]:
  9. def second() -> str:
  10. return 'b.first.second: nested function'
  11. return second
  12. return first
  13. def c(num: float) -> Callable[[str], str]:
  14. def inner(s: str) -> str:
  15. return s + '!'
  16. return inner
  17. def d(num: float) -> str:
  18. def inner(s: str) -> str:
  19. return s + '?'
  20. a = inner('one')
  21. b = inner('two')
  22. return a
  23. def inner() -> str:
  24. return 'inner: normal function'
  25. def first() -> str:
  26. return 'first: normal function'
  27. def second() -> str:
  28. return 'second: normal function'
  29. [out]
  30. def inner_a_obj.__get__(__mypyc_self__, instance, owner):
  31. __mypyc_self__, instance, owner, r0 :: object
  32. r1 :: bit
  33. r2 :: object
  34. L0:
  35. r0 = load_address _Py_NoneStruct
  36. r1 = instance == r0
  37. if r1 goto L1 else goto L2 :: bool
  38. L1:
  39. return __mypyc_self__
  40. L2:
  41. r2 = PyMethod_New(__mypyc_self__, instance)
  42. return r2
  43. def inner_a_obj.__call__(__mypyc_self__):
  44. __mypyc_self__ :: __main__.inner_a_obj
  45. r0 :: __main__.a_env
  46. r1, inner, r2 :: object
  47. L0:
  48. r0 = __mypyc_self__.__mypyc_env__
  49. r1 = r0.inner
  50. inner = r1
  51. r2 = box(None, 1)
  52. return r2
  53. def a():
  54. r0 :: __main__.a_env
  55. r1 :: __main__.inner_a_obj
  56. r2, r3 :: bool
  57. r4 :: object
  58. L0:
  59. r0 = a_env()
  60. r1 = inner_a_obj()
  61. r1.__mypyc_env__ = r0; r2 = is_error
  62. r0.inner = r1; r3 = is_error
  63. r4 = r0.inner
  64. return r4
  65. def second_b_first_obj.__get__(__mypyc_self__, instance, owner):
  66. __mypyc_self__, instance, owner, r0 :: object
  67. r1 :: bit
  68. r2 :: object
  69. L0:
  70. r0 = load_address _Py_NoneStruct
  71. r1 = instance == r0
  72. if r1 goto L1 else goto L2 :: bool
  73. L1:
  74. return __mypyc_self__
  75. L2:
  76. r2 = PyMethod_New(__mypyc_self__, instance)
  77. return r2
  78. def second_b_first_obj.__call__(__mypyc_self__):
  79. __mypyc_self__ :: __main__.second_b_first_obj
  80. r0 :: __main__.first_b_env
  81. r1 :: __main__.b_env
  82. r2, second :: object
  83. r3 :: str
  84. L0:
  85. r0 = __mypyc_self__.__mypyc_env__
  86. r1 = r0.__mypyc_env__
  87. r2 = r0.second
  88. second = r2
  89. r3 = 'b.first.second: nested function'
  90. return r3
  91. def first_b_obj.__get__(__mypyc_self__, instance, owner):
  92. __mypyc_self__, instance, owner, r0 :: object
  93. r1 :: bit
  94. r2 :: object
  95. L0:
  96. r0 = load_address _Py_NoneStruct
  97. r1 = instance == r0
  98. if r1 goto L1 else goto L2 :: bool
  99. L1:
  100. return __mypyc_self__
  101. L2:
  102. r2 = PyMethod_New(__mypyc_self__, instance)
  103. return r2
  104. def first_b_obj.__call__(__mypyc_self__):
  105. __mypyc_self__ :: __main__.first_b_obj
  106. r0 :: __main__.b_env
  107. r1, first :: object
  108. r2 :: __main__.first_b_env
  109. r3 :: bool
  110. r4 :: __main__.second_b_first_obj
  111. r5, r6 :: bool
  112. r7 :: object
  113. L0:
  114. r0 = __mypyc_self__.__mypyc_env__
  115. r1 = r0.first
  116. first = r1
  117. r2 = first_b_env()
  118. r2.__mypyc_env__ = r0; r3 = is_error
  119. r4 = second_b_first_obj()
  120. r4.__mypyc_env__ = r2; r5 = is_error
  121. r2.second = r4; r6 = is_error
  122. r7 = r2.second
  123. return r7
  124. def b():
  125. r0 :: __main__.b_env
  126. r1 :: __main__.first_b_obj
  127. r2, r3 :: bool
  128. r4 :: object
  129. L0:
  130. r0 = b_env()
  131. r1 = first_b_obj()
  132. r1.__mypyc_env__ = r0; r2 = is_error
  133. r0.first = r1; r3 = is_error
  134. r4 = r0.first
  135. return r4
  136. def inner_c_obj.__get__(__mypyc_self__, instance, owner):
  137. __mypyc_self__, instance, owner, r0 :: object
  138. r1 :: bit
  139. r2 :: object
  140. L0:
  141. r0 = load_address _Py_NoneStruct
  142. r1 = instance == r0
  143. if r1 goto L1 else goto L2 :: bool
  144. L1:
  145. return __mypyc_self__
  146. L2:
  147. r2 = PyMethod_New(__mypyc_self__, instance)
  148. return r2
  149. def inner_c_obj.__call__(__mypyc_self__, s):
  150. __mypyc_self__ :: __main__.inner_c_obj
  151. s :: str
  152. r0 :: __main__.c_env
  153. r1, inner :: object
  154. r2, r3 :: str
  155. L0:
  156. r0 = __mypyc_self__.__mypyc_env__
  157. r1 = r0.inner
  158. inner = r1
  159. r2 = '!'
  160. r3 = PyUnicode_Concat(s, r2)
  161. return r3
  162. def c(num):
  163. num :: float
  164. r0 :: __main__.c_env
  165. r1 :: __main__.inner_c_obj
  166. r2, r3 :: bool
  167. r4 :: object
  168. L0:
  169. r0 = c_env()
  170. r1 = inner_c_obj()
  171. r1.__mypyc_env__ = r0; r2 = is_error
  172. r0.inner = r1; r3 = is_error
  173. r4 = r0.inner
  174. return r4
  175. def inner_d_obj.__get__(__mypyc_self__, instance, owner):
  176. __mypyc_self__, instance, owner, r0 :: object
  177. r1 :: bit
  178. r2 :: object
  179. L0:
  180. r0 = load_address _Py_NoneStruct
  181. r1 = instance == r0
  182. if r1 goto L1 else goto L2 :: bool
  183. L1:
  184. return __mypyc_self__
  185. L2:
  186. r2 = PyMethod_New(__mypyc_self__, instance)
  187. return r2
  188. def inner_d_obj.__call__(__mypyc_self__, s):
  189. __mypyc_self__ :: __main__.inner_d_obj
  190. s :: str
  191. r0 :: __main__.d_env
  192. r1, inner :: object
  193. r2, r3 :: str
  194. L0:
  195. r0 = __mypyc_self__.__mypyc_env__
  196. r1 = r0.inner
  197. inner = r1
  198. r2 = '?'
  199. r3 = PyUnicode_Concat(s, r2)
  200. return r3
  201. def d(num):
  202. num :: float
  203. r0 :: __main__.d_env
  204. r1 :: __main__.inner_d_obj
  205. r2, r3 :: bool
  206. r4 :: str
  207. r5, r6 :: object
  208. r7, a, r8 :: str
  209. r9, r10 :: object
  210. r11, b :: str
  211. L0:
  212. r0 = d_env()
  213. r1 = inner_d_obj()
  214. r1.__mypyc_env__ = r0; r2 = is_error
  215. r0.inner = r1; r3 = is_error
  216. r4 = 'one'
  217. r5 = r0.inner
  218. r6 = PyObject_CallFunctionObjArgs(r5, r4, 0)
  219. r7 = cast(str, r6)
  220. a = r7
  221. r8 = 'two'
  222. r9 = r0.inner
  223. r10 = PyObject_CallFunctionObjArgs(r9, r8, 0)
  224. r11 = cast(str, r10)
  225. b = r11
  226. return a
  227. def inner():
  228. r0 :: str
  229. L0:
  230. r0 = 'inner: normal function'
  231. return r0
  232. def first():
  233. r0 :: str
  234. L0:
  235. r0 = 'first: normal function'
  236. return r0
  237. def second():
  238. r0 :: str
  239. L0:
  240. r0 = 'second: normal function'
  241. return r0
  242. [case testFreeVars]
  243. from typing import Callable
  244. def a(num: int) -> int:
  245. def inner() -> int:
  246. return num
  247. return inner()
  248. def b() -> int:
  249. num = 3
  250. def inner() -> int:
  251. nonlocal num
  252. num = 4
  253. foo = 6
  254. return num
  255. return inner() + num
  256. def c(flag: bool) -> str:
  257. if flag:
  258. def inner() -> str:
  259. return 'f.inner: first definition'
  260. else:
  261. def inner() -> str:
  262. return 'f.inner: second definition'
  263. return inner()
  264. [out]
  265. def inner_a_obj.__get__(__mypyc_self__, instance, owner):
  266. __mypyc_self__, instance, owner, r0 :: object
  267. r1 :: bit
  268. r2 :: object
  269. L0:
  270. r0 = load_address _Py_NoneStruct
  271. r1 = instance == r0
  272. if r1 goto L1 else goto L2 :: bool
  273. L1:
  274. return __mypyc_self__
  275. L2:
  276. r2 = PyMethod_New(__mypyc_self__, instance)
  277. return r2
  278. def inner_a_obj.__call__(__mypyc_self__):
  279. __mypyc_self__ :: __main__.inner_a_obj
  280. r0 :: __main__.a_env
  281. r1, inner :: object
  282. r2 :: int
  283. L0:
  284. r0 = __mypyc_self__.__mypyc_env__
  285. r1 = r0.inner
  286. inner = r1
  287. r2 = r0.num
  288. return r2
  289. def a(num):
  290. num :: int
  291. r0 :: __main__.a_env
  292. r1 :: bool
  293. r2 :: __main__.inner_a_obj
  294. r3, r4 :: bool
  295. r5, r6 :: object
  296. r7 :: int
  297. L0:
  298. r0 = a_env()
  299. r0.num = num; r1 = is_error
  300. r2 = inner_a_obj()
  301. r2.__mypyc_env__ = r0; r3 = is_error
  302. r0.inner = r2; r4 = is_error
  303. r5 = r0.inner
  304. r6 = PyObject_CallFunctionObjArgs(r5, 0)
  305. r7 = unbox(int, r6)
  306. return r7
  307. def inner_b_obj.__get__(__mypyc_self__, instance, owner):
  308. __mypyc_self__, instance, owner, r0 :: object
  309. r1 :: bit
  310. r2 :: object
  311. L0:
  312. r0 = load_address _Py_NoneStruct
  313. r1 = instance == r0
  314. if r1 goto L1 else goto L2 :: bool
  315. L1:
  316. return __mypyc_self__
  317. L2:
  318. r2 = PyMethod_New(__mypyc_self__, instance)
  319. return r2
  320. def inner_b_obj.__call__(__mypyc_self__):
  321. __mypyc_self__ :: __main__.inner_b_obj
  322. r0 :: __main__.b_env
  323. r1, inner :: object
  324. r2 :: bool
  325. foo, r3 :: int
  326. L0:
  327. r0 = __mypyc_self__.__mypyc_env__
  328. r1 = r0.inner
  329. inner = r1
  330. r0.num = 8; r2 = is_error
  331. foo = 12
  332. r3 = r0.num
  333. return r3
  334. def b():
  335. r0 :: __main__.b_env
  336. r1 :: bool
  337. r2 :: __main__.inner_b_obj
  338. r3, r4 :: bool
  339. r5, r6 :: object
  340. r7, r8, r9 :: int
  341. L0:
  342. r0 = b_env()
  343. r0.num = 6; r1 = is_error
  344. r2 = inner_b_obj()
  345. r2.__mypyc_env__ = r0; r3 = is_error
  346. r0.inner = r2; r4 = is_error
  347. r5 = r0.inner
  348. r6 = PyObject_CallFunctionObjArgs(r5, 0)
  349. r7 = unbox(int, r6)
  350. r8 = r0.num
  351. r9 = CPyTagged_Add(r7, r8)
  352. return r9
  353. def inner_c_obj.__get__(__mypyc_self__, instance, owner):
  354. __mypyc_self__, instance, owner, r0 :: object
  355. r1 :: bit
  356. r2 :: object
  357. L0:
  358. r0 = load_address _Py_NoneStruct
  359. r1 = instance == r0
  360. if r1 goto L1 else goto L2 :: bool
  361. L1:
  362. return __mypyc_self__
  363. L2:
  364. r2 = PyMethod_New(__mypyc_self__, instance)
  365. return r2
  366. def inner_c_obj.__call__(__mypyc_self__):
  367. __mypyc_self__ :: __main__.inner_c_obj
  368. r0 :: __main__.c_env
  369. r1, inner :: object
  370. r2 :: str
  371. L0:
  372. r0 = __mypyc_self__.__mypyc_env__
  373. r1 = r0.inner
  374. inner = r1
  375. r2 = 'f.inner: first definition'
  376. return r2
  377. def inner_c_obj_0.__get__(__mypyc_self__, instance, owner):
  378. __mypyc_self__, instance, owner, r0 :: object
  379. r1 :: bit
  380. r2 :: object
  381. L0:
  382. r0 = load_address _Py_NoneStruct
  383. r1 = instance == r0
  384. if r1 goto L1 else goto L2 :: bool
  385. L1:
  386. return __mypyc_self__
  387. L2:
  388. r2 = PyMethod_New(__mypyc_self__, instance)
  389. return r2
  390. def inner_c_obj_0.__call__(__mypyc_self__):
  391. __mypyc_self__ :: __main__.inner_c_obj_0
  392. r0 :: __main__.c_env
  393. r1, inner :: object
  394. r2 :: str
  395. L0:
  396. r0 = __mypyc_self__.__mypyc_env__
  397. r1 = r0.inner
  398. inner = r1
  399. r2 = 'f.inner: second definition'
  400. return r2
  401. def c(flag):
  402. flag :: bool
  403. r0 :: __main__.c_env
  404. r1 :: __main__.inner_c_obj
  405. r2, r3 :: bool
  406. r4 :: __main__.inner_c_obj_0
  407. r5, r6 :: bool
  408. r7, r8 :: object
  409. r9 :: str
  410. L0:
  411. r0 = c_env()
  412. if flag goto L1 else goto L2 :: bool
  413. L1:
  414. r1 = inner_c_obj()
  415. r1.__mypyc_env__ = r0; r2 = is_error
  416. r0.inner = r1; r3 = is_error
  417. goto L3
  418. L2:
  419. r4 = inner_c_obj_0()
  420. r4.__mypyc_env__ = r0; r5 = is_error
  421. r0.inner = r4; r6 = is_error
  422. L3:
  423. r7 = r0.inner
  424. r8 = PyObject_CallFunctionObjArgs(r7, 0)
  425. r9 = cast(str, r8)
  426. return r9
  427. [case testSpecialNested]
  428. def a() -> int:
  429. x = 1
  430. def b() -> int:
  431. x += 1
  432. def c() -> int:
  433. return x
  434. return c()
  435. return b()
  436. [out]
  437. def c_a_b_obj.__get__(__mypyc_self__, instance, owner):
  438. __mypyc_self__, instance, owner, r0 :: object
  439. r1 :: bit
  440. r2 :: object
  441. L0:
  442. r0 = load_address _Py_NoneStruct
  443. r1 = instance == r0
  444. if r1 goto L1 else goto L2 :: bool
  445. L1:
  446. return __mypyc_self__
  447. L2:
  448. r2 = PyMethod_New(__mypyc_self__, instance)
  449. return r2
  450. def c_a_b_obj.__call__(__mypyc_self__):
  451. __mypyc_self__ :: __main__.c_a_b_obj
  452. r0 :: __main__.b_a_env
  453. r1 :: __main__.a_env
  454. r2, c :: object
  455. r3 :: int
  456. L0:
  457. r0 = __mypyc_self__.__mypyc_env__
  458. r1 = r0.__mypyc_env__
  459. r2 = r0.c
  460. c = r2
  461. r3 = r1.x
  462. return r3
  463. def b_a_obj.__get__(__mypyc_self__, instance, owner):
  464. __mypyc_self__, instance, owner, r0 :: object
  465. r1 :: bit
  466. r2 :: object
  467. L0:
  468. r0 = load_address _Py_NoneStruct
  469. r1 = instance == r0
  470. if r1 goto L1 else goto L2 :: bool
  471. L1:
  472. return __mypyc_self__
  473. L2:
  474. r2 = PyMethod_New(__mypyc_self__, instance)
  475. return r2
  476. def b_a_obj.__call__(__mypyc_self__):
  477. __mypyc_self__ :: __main__.b_a_obj
  478. r0 :: __main__.a_env
  479. r1, b :: object
  480. r2 :: __main__.b_a_env
  481. r3 :: bool
  482. r4, r5 :: int
  483. r6 :: bool
  484. r7 :: __main__.c_a_b_obj
  485. r8, r9 :: bool
  486. r10, r11 :: object
  487. r12 :: int
  488. L0:
  489. r0 = __mypyc_self__.__mypyc_env__
  490. r1 = r0.b
  491. b = r1
  492. r2 = b_a_env()
  493. r2.__mypyc_env__ = r0; r3 = is_error
  494. r4 = r0.x
  495. r5 = CPyTagged_Add(r4, 2)
  496. r0.x = r5; r6 = is_error
  497. r7 = c_a_b_obj()
  498. r7.__mypyc_env__ = r2; r8 = is_error
  499. r2.c = r7; r9 = is_error
  500. r10 = r2.c
  501. r11 = PyObject_CallFunctionObjArgs(r10, 0)
  502. r12 = unbox(int, r11)
  503. return r12
  504. def a():
  505. r0 :: __main__.a_env
  506. r1 :: bool
  507. r2 :: __main__.b_a_obj
  508. r3, r4 :: bool
  509. r5, r6 :: object
  510. r7 :: int
  511. L0:
  512. r0 = a_env()
  513. r0.x = 2; r1 = is_error
  514. r2 = b_a_obj()
  515. r2.__mypyc_env__ = r0; r3 = is_error
  516. r0.b = r2; r4 = is_error
  517. r5 = r0.b
  518. r6 = PyObject_CallFunctionObjArgs(r5, 0)
  519. r7 = unbox(int, r6)
  520. return r7
  521. [case testNestedFunctionInsideStatements]
  522. def f(flag: bool) -> str:
  523. if flag:
  524. def inner() -> str:
  525. return 'f.inner: first definition'
  526. else:
  527. def inner() -> str:
  528. return 'f.inner: second definition'
  529. return inner()
  530. [out]
  531. def inner_f_obj.__get__(__mypyc_self__, instance, owner):
  532. __mypyc_self__, instance, owner, r0 :: object
  533. r1 :: bit
  534. r2 :: object
  535. L0:
  536. r0 = load_address _Py_NoneStruct
  537. r1 = instance == r0
  538. if r1 goto L1 else goto L2 :: bool
  539. L1:
  540. return __mypyc_self__
  541. L2:
  542. r2 = PyMethod_New(__mypyc_self__, instance)
  543. return r2
  544. def inner_f_obj.__call__(__mypyc_self__):
  545. __mypyc_self__ :: __main__.inner_f_obj
  546. r0 :: __main__.f_env
  547. r1, inner :: object
  548. r2 :: str
  549. L0:
  550. r0 = __mypyc_self__.__mypyc_env__
  551. r1 = r0.inner
  552. inner = r1
  553. r2 = 'f.inner: first definition'
  554. return r2
  555. def inner_f_obj_0.__get__(__mypyc_self__, instance, owner):
  556. __mypyc_self__, instance, owner, r0 :: object
  557. r1 :: bit
  558. r2 :: object
  559. L0:
  560. r0 = load_address _Py_NoneStruct
  561. r1 = instance == r0
  562. if r1 goto L1 else goto L2 :: bool
  563. L1:
  564. return __mypyc_self__
  565. L2:
  566. r2 = PyMethod_New(__mypyc_self__, instance)
  567. return r2
  568. def inner_f_obj_0.__call__(__mypyc_self__):
  569. __mypyc_self__ :: __main__.inner_f_obj_0
  570. r0 :: __main__.f_env
  571. r1, inner :: object
  572. r2 :: str
  573. L0:
  574. r0 = __mypyc_self__.__mypyc_env__
  575. r1 = r0.inner
  576. inner = r1
  577. r2 = 'f.inner: second definition'
  578. return r2
  579. def f(flag):
  580. flag :: bool
  581. r0 :: __main__.f_env
  582. r1 :: __main__.inner_f_obj
  583. r2, r3 :: bool
  584. r4 :: __main__.inner_f_obj_0
  585. r5, r6 :: bool
  586. r7, r8 :: object
  587. r9 :: str
  588. L0:
  589. r0 = f_env()
  590. if flag goto L1 else goto L2 :: bool
  591. L1:
  592. r1 = inner_f_obj()
  593. r1.__mypyc_env__ = r0; r2 = is_error
  594. r0.inner = r1; r3 = is_error
  595. goto L3
  596. L2:
  597. r4 = inner_f_obj_0()
  598. r4.__mypyc_env__ = r0; r5 = is_error
  599. r0.inner = r4; r6 = is_error
  600. L3:
  601. r7 = r0.inner
  602. r8 = PyObject_CallFunctionObjArgs(r7, 0)
  603. r9 = cast(str, r8)
  604. return r9
  605. [case testNestedFunctionsCallEachOther]
  606. from typing import Callable, List
  607. def f(a: int) -> int:
  608. def foo() -> int:
  609. return a + 1
  610. def bar() -> int:
  611. return foo()
  612. def baz(n: int) -> int:
  613. if n == 0:
  614. return 0
  615. return n + baz(n - 1)
  616. return bar() + baz(a)
  617. [out]
  618. def foo_f_obj.__get__(__mypyc_self__, instance, owner):
  619. __mypyc_self__, instance, owner, r0 :: object
  620. r1 :: bit
  621. r2 :: object
  622. L0:
  623. r0 = load_address _Py_NoneStruct
  624. r1 = instance == r0
  625. if r1 goto L1 else goto L2 :: bool
  626. L1:
  627. return __mypyc_self__
  628. L2:
  629. r2 = PyMethod_New(__mypyc_self__, instance)
  630. return r2
  631. def foo_f_obj.__call__(__mypyc_self__):
  632. __mypyc_self__ :: __main__.foo_f_obj
  633. r0 :: __main__.f_env
  634. r1, foo :: object
  635. r2, r3 :: int
  636. L0:
  637. r0 = __mypyc_self__.__mypyc_env__
  638. r1 = r0.foo
  639. foo = r1
  640. r2 = r0.a
  641. r3 = CPyTagged_Add(r2, 2)
  642. return r3
  643. def bar_f_obj.__get__(__mypyc_self__, instance, owner):
  644. __mypyc_self__, instance, owner, r0 :: object
  645. r1 :: bit
  646. r2 :: object
  647. L0:
  648. r0 = load_address _Py_NoneStruct
  649. r1 = instance == r0
  650. if r1 goto L1 else goto L2 :: bool
  651. L1:
  652. return __mypyc_self__
  653. L2:
  654. r2 = PyMethod_New(__mypyc_self__, instance)
  655. return r2
  656. def bar_f_obj.__call__(__mypyc_self__):
  657. __mypyc_self__ :: __main__.bar_f_obj
  658. r0 :: __main__.f_env
  659. r1, bar, r2, r3 :: object
  660. r4 :: int
  661. L0:
  662. r0 = __mypyc_self__.__mypyc_env__
  663. r1 = r0.bar
  664. bar = r1
  665. r2 = r0.foo
  666. r3 = PyObject_CallFunctionObjArgs(r2, 0)
  667. r4 = unbox(int, r3)
  668. return r4
  669. def baz_f_obj.__get__(__mypyc_self__, instance, owner):
  670. __mypyc_self__, instance, owner, r0 :: object
  671. r1 :: bit
  672. r2 :: object
  673. L0:
  674. r0 = load_address _Py_NoneStruct
  675. r1 = instance == r0
  676. if r1 goto L1 else goto L2 :: bool
  677. L1:
  678. return __mypyc_self__
  679. L2:
  680. r2 = PyMethod_New(__mypyc_self__, instance)
  681. return r2
  682. def baz_f_obj.__call__(__mypyc_self__, n):
  683. __mypyc_self__ :: __main__.baz_f_obj
  684. n :: int
  685. r0 :: __main__.f_env
  686. r1, baz :: object
  687. r2 :: bit
  688. r3 :: int
  689. r4, r5 :: object
  690. r6, r7 :: int
  691. L0:
  692. r0 = __mypyc_self__.__mypyc_env__
  693. r1 = r0.baz
  694. baz = r1
  695. r2 = n == 0
  696. if r2 goto L1 else goto L2 :: bool
  697. L1:
  698. return 0
  699. L2:
  700. r3 = CPyTagged_Subtract(n, 2)
  701. r4 = box(int, r3)
  702. r5 = PyObject_CallFunctionObjArgs(baz, r4, 0)
  703. r6 = unbox(int, r5)
  704. r7 = CPyTagged_Add(n, r6)
  705. return r7
  706. def f(a):
  707. a :: int
  708. r0 :: __main__.f_env
  709. r1 :: bool
  710. r2 :: __main__.foo_f_obj
  711. r3, r4 :: bool
  712. r5 :: __main__.bar_f_obj
  713. r6, r7 :: bool
  714. r8 :: __main__.baz_f_obj
  715. r9, r10 :: bool
  716. r11, r12 :: object
  717. r13, r14 :: int
  718. r15, r16, r17 :: object
  719. r18, r19 :: int
  720. L0:
  721. r0 = f_env()
  722. r0.a = a; r1 = is_error
  723. r2 = foo_f_obj()
  724. r2.__mypyc_env__ = r0; r3 = is_error
  725. r0.foo = r2; r4 = is_error
  726. r5 = bar_f_obj()
  727. r5.__mypyc_env__ = r0; r6 = is_error
  728. r0.bar = r5; r7 = is_error
  729. r8 = baz_f_obj()
  730. r8.__mypyc_env__ = r0; r9 = is_error
  731. r0.baz = r8; r10 = is_error
  732. r11 = r0.bar
  733. r12 = PyObject_CallFunctionObjArgs(r11, 0)
  734. r13 = unbox(int, r12)
  735. r14 = r0.a
  736. r15 = r0.baz
  737. r16 = box(int, r14)
  738. r17 = PyObject_CallFunctionObjArgs(r15, r16, 0)
  739. r18 = unbox(int, r17)
  740. r19 = CPyTagged_Add(r13, r18)
  741. return r19
  742. [case testLambdas]
  743. def f(x: int, y: int) -> None:
  744. s = lambda a, b: a + b
  745. t = lambda a, b: s(a, b)
  746. return t(x, y)
  747. [out]
  748. def __mypyc_lambda__0_f_obj.__get__(__mypyc_self__, instance, owner):
  749. __mypyc_self__, instance, owner, r0 :: object
  750. r1 :: bit
  751. r2 :: object
  752. L0:
  753. r0 = load_address _Py_NoneStruct
  754. r1 = instance == r0
  755. if r1 goto L1 else goto L2 :: bool
  756. L1:
  757. return __mypyc_self__
  758. L2:
  759. r2 = PyMethod_New(__mypyc_self__, instance)
  760. return r2
  761. def __mypyc_lambda__0_f_obj.__call__(__mypyc_self__, a, b):
  762. __mypyc_self__ :: __main__.__mypyc_lambda__0_f_obj
  763. a, b :: object
  764. r0 :: __main__.f_env
  765. r1 :: object
  766. L0:
  767. r0 = __mypyc_self__.__mypyc_env__
  768. r1 = PyNumber_Add(a, b)
  769. return r1
  770. def __mypyc_lambda__1_f_obj.__get__(__mypyc_self__, instance, owner):
  771. __mypyc_self__, instance, owner, r0 :: object
  772. r1 :: bit
  773. r2 :: object
  774. L0:
  775. r0 = load_address _Py_NoneStruct
  776. r1 = instance == r0
  777. if r1 goto L1 else goto L2 :: bool
  778. L1:
  779. return __mypyc_self__
  780. L2:
  781. r2 = PyMethod_New(__mypyc_self__, instance)
  782. return r2
  783. def __mypyc_lambda__1_f_obj.__call__(__mypyc_self__, a, b):
  784. __mypyc_self__ :: __main__.__mypyc_lambda__1_f_obj
  785. a, b :: object
  786. r0 :: __main__.f_env
  787. r1, r2 :: object
  788. L0:
  789. r0 = __mypyc_self__.__mypyc_env__
  790. r1 = r0.s
  791. r2 = PyObject_CallFunctionObjArgs(r1, a, b, 0)
  792. return r2
  793. def f(x, y):
  794. x, y :: int
  795. r0 :: __main__.f_env
  796. r1 :: __main__.__mypyc_lambda__0_f_obj
  797. r2, r3 :: bool
  798. r4 :: __main__.__mypyc_lambda__1_f_obj
  799. r5 :: bool
  800. t, r6, r7, r8 :: object
  801. r9 :: None
  802. L0:
  803. r0 = f_env()
  804. r1 = __mypyc_lambda__0_f_obj()
  805. r1.__mypyc_env__ = r0; r2 = is_error
  806. r0.s = r1; r3 = is_error
  807. r4 = __mypyc_lambda__1_f_obj()
  808. r4.__mypyc_env__ = r0; r5 = is_error
  809. t = r4
  810. r6 = box(int, x)
  811. r7 = box(int, y)
  812. r8 = PyObject_CallFunctionObjArgs(t, r6, r7, 0)
  813. r9 = unbox(None, r8)
  814. return r9
  815. [case testRecursiveFunction]
  816. from typing import Callable
  817. def baz(n: int) -> int:
  818. if n == 0:
  819. return 0
  820. return n + baz(n - 1)
  821. [out]
  822. def baz(n):
  823. n :: int
  824. r0 :: bit
  825. r1, r2, r3 :: int
  826. L0:
  827. r0 = n == 0
  828. if r0 goto L1 else goto L2 :: bool
  829. L1:
  830. return 0
  831. L2:
  832. r1 = CPyTagged_Subtract(n, 2)
  833. r2 = baz(r1)
  834. r3 = CPyTagged_Add(n, r2)
  835. return r3