irbuild-singledispatch.test 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. [case testNativeCallsUsedInDispatchFunction]
  2. from functools import singledispatch
  3. @singledispatch
  4. def f(arg) -> bool:
  5. return False
  6. @f.register
  7. def g(arg: int) -> bool:
  8. return True
  9. [out]
  10. def __mypyc_singledispatch_main_function_f__(arg):
  11. arg :: object
  12. L0:
  13. return 0
  14. def f_obj.__init__(__mypyc_self__):
  15. __mypyc_self__ :: __main__.f_obj
  16. r0, r1 :: dict
  17. r2 :: str
  18. r3 :: i32
  19. r4 :: bit
  20. L0:
  21. r0 = PyDict_New()
  22. __mypyc_self__.registry = r0
  23. r1 = PyDict_New()
  24. r2 = 'dispatch_cache'
  25. r3 = PyObject_SetAttr(__mypyc_self__, r2, r1)
  26. r4 = r3 >= 0 :: signed
  27. return 1
  28. def f_obj.__call__(__mypyc_self__, arg):
  29. __mypyc_self__ :: __main__.f_obj
  30. arg :: object
  31. r0 :: ptr
  32. r1 :: object
  33. r2 :: dict
  34. r3, r4 :: object
  35. r5 :: bit
  36. r6, r7 :: object
  37. r8 :: str
  38. r9 :: object
  39. r10 :: dict
  40. r11 :: object
  41. r12 :: i32
  42. r13 :: bit
  43. r14 :: object
  44. r15 :: ptr
  45. r16 :: object
  46. r17 :: bit
  47. r18 :: int
  48. r19 :: bit
  49. r20 :: int
  50. r21 :: bool
  51. r22 :: object
  52. r23 :: bool
  53. L0:
  54. r0 = get_element_ptr arg ob_type :: PyObject
  55. r1 = load_mem r0 :: builtins.object*
  56. keep_alive arg
  57. r2 = __mypyc_self__.dispatch_cache
  58. r3 = CPyDict_GetWithNone(r2, r1)
  59. r4 = load_address _Py_NoneStruct
  60. r5 = r3 != r4
  61. if r5 goto L1 else goto L2 :: bool
  62. L1:
  63. r6 = r3
  64. goto L3
  65. L2:
  66. r7 = functools :: module
  67. r8 = '_find_impl'
  68. r9 = CPyObject_GetAttr(r7, r8)
  69. r10 = __mypyc_self__.registry
  70. r11 = PyObject_CallFunctionObjArgs(r9, r1, r10, 0)
  71. r12 = CPyDict_SetItem(r2, r1, r11)
  72. r13 = r12 >= 0 :: signed
  73. r6 = r11
  74. L3:
  75. r14 = load_address PyLong_Type
  76. r15 = get_element_ptr r6 ob_type :: PyObject
  77. r16 = load_mem r15 :: builtins.object*
  78. keep_alive r6
  79. r17 = r16 == r14
  80. if r17 goto L4 else goto L7 :: bool
  81. L4:
  82. r18 = unbox(int, r6)
  83. r19 = r18 == 0
  84. if r19 goto L5 else goto L6 :: bool
  85. L5:
  86. r20 = unbox(int, arg)
  87. r21 = g(r20)
  88. return r21
  89. L6:
  90. unreachable
  91. L7:
  92. r22 = PyObject_CallFunctionObjArgs(r6, arg, 0)
  93. r23 = unbox(bool, r22)
  94. return r23
  95. def f_obj.__get__(__mypyc_self__, instance, owner):
  96. __mypyc_self__, instance, owner, r0 :: object
  97. r1 :: bit
  98. r2 :: object
  99. L0:
  100. r0 = load_address _Py_NoneStruct
  101. r1 = instance == r0
  102. if r1 goto L1 else goto L2 :: bool
  103. L1:
  104. return __mypyc_self__
  105. L2:
  106. r2 = PyMethod_New(__mypyc_self__, instance)
  107. return r2
  108. def f_obj.register(__mypyc_self__, cls, func):
  109. __mypyc_self__ :: __main__.f_obj
  110. cls, func, r0 :: object
  111. L0:
  112. r0 = CPySingledispatch_RegisterFunction(__mypyc_self__, cls, func)
  113. return r0
  114. def f(arg):
  115. arg :: object
  116. r0 :: dict
  117. r1 :: str
  118. r2 :: object
  119. r3 :: bool
  120. L0:
  121. r0 = __main__.globals :: static
  122. r1 = 'f'
  123. r2 = CPyDict_GetItem(r0, r1)
  124. r3 = f_obj.__call__(r2, arg)
  125. return r3
  126. def g(arg):
  127. arg :: int
  128. L0:
  129. return 1
  130. [case testCallsToSingledispatchFunctionsAreNative]
  131. from functools import singledispatch
  132. @singledispatch
  133. def f(x: object) -> None:
  134. pass
  135. def test():
  136. f('a')
  137. [out]
  138. def __mypyc_singledispatch_main_function_f__(x):
  139. x :: object
  140. L0:
  141. return 1
  142. def f_obj.__init__(__mypyc_self__):
  143. __mypyc_self__ :: __main__.f_obj
  144. r0, r1 :: dict
  145. r2 :: str
  146. r3 :: i32
  147. r4 :: bit
  148. L0:
  149. r0 = PyDict_New()
  150. __mypyc_self__.registry = r0
  151. r1 = PyDict_New()
  152. r2 = 'dispatch_cache'
  153. r3 = PyObject_SetAttr(__mypyc_self__, r2, r1)
  154. r4 = r3 >= 0 :: signed
  155. return 1
  156. def f_obj.__call__(__mypyc_self__, x):
  157. __mypyc_self__ :: __main__.f_obj
  158. x :: object
  159. r0 :: ptr
  160. r1 :: object
  161. r2 :: dict
  162. r3, r4 :: object
  163. r5 :: bit
  164. r6, r7 :: object
  165. r8 :: str
  166. r9 :: object
  167. r10 :: dict
  168. r11 :: object
  169. r12 :: i32
  170. r13 :: bit
  171. r14 :: object
  172. r15 :: ptr
  173. r16 :: object
  174. r17 :: bit
  175. r18 :: int
  176. r19 :: object
  177. r20 :: None
  178. L0:
  179. r0 = get_element_ptr x ob_type :: PyObject
  180. r1 = load_mem r0 :: builtins.object*
  181. keep_alive x
  182. r2 = __mypyc_self__.dispatch_cache
  183. r3 = CPyDict_GetWithNone(r2, r1)
  184. r4 = load_address _Py_NoneStruct
  185. r5 = r3 != r4
  186. if r5 goto L1 else goto L2 :: bool
  187. L1:
  188. r6 = r3
  189. goto L3
  190. L2:
  191. r7 = functools :: module
  192. r8 = '_find_impl'
  193. r9 = CPyObject_GetAttr(r7, r8)
  194. r10 = __mypyc_self__.registry
  195. r11 = PyObject_CallFunctionObjArgs(r9, r1, r10, 0)
  196. r12 = CPyDict_SetItem(r2, r1, r11)
  197. r13 = r12 >= 0 :: signed
  198. r6 = r11
  199. L3:
  200. r14 = load_address PyLong_Type
  201. r15 = get_element_ptr r6 ob_type :: PyObject
  202. r16 = load_mem r15 :: builtins.object*
  203. keep_alive r6
  204. r17 = r16 == r14
  205. if r17 goto L4 else goto L5 :: bool
  206. L4:
  207. r18 = unbox(int, r6)
  208. unreachable
  209. L5:
  210. r19 = PyObject_CallFunctionObjArgs(r6, x, 0)
  211. r20 = unbox(None, r19)
  212. return r20
  213. def f_obj.__get__(__mypyc_self__, instance, owner):
  214. __mypyc_self__, instance, owner, r0 :: object
  215. r1 :: bit
  216. r2 :: object
  217. L0:
  218. r0 = load_address _Py_NoneStruct
  219. r1 = instance == r0
  220. if r1 goto L1 else goto L2 :: bool
  221. L1:
  222. return __mypyc_self__
  223. L2:
  224. r2 = PyMethod_New(__mypyc_self__, instance)
  225. return r2
  226. def f_obj.register(__mypyc_self__, cls, func):
  227. __mypyc_self__ :: __main__.f_obj
  228. cls, func, r0 :: object
  229. L0:
  230. r0 = CPySingledispatch_RegisterFunction(__mypyc_self__, cls, func)
  231. return r0
  232. def f(x):
  233. x :: object
  234. r0 :: dict
  235. r1 :: str
  236. r2 :: object
  237. r3 :: None
  238. L0:
  239. r0 = __main__.globals :: static
  240. r1 = 'f'
  241. r2 = CPyDict_GetItem(r0, r1)
  242. r3 = f_obj.__call__(r2, x)
  243. return r3
  244. def test():
  245. r0 :: str
  246. r1 :: None
  247. r2 :: object
  248. L0:
  249. r0 = 'a'
  250. r1 = f(r0)
  251. r2 = box(None, 1)
  252. return r2