mypy-dev 1.9.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1018) hide show
  1. mypy/__init__.py +1 -0
  2. mypy/__main__.py +37 -0
  3. mypy/api.py +94 -0
  4. mypy/applytype.py +156 -0
  5. mypy/argmap.py +268 -0
  6. mypy/binder.py +538 -0
  7. mypy/bogus_type.py +27 -0
  8. mypy/build.py +3562 -0
  9. mypy/checker.py +8372 -0
  10. mypy/checkexpr.py +6615 -0
  11. mypy/checkmember.py +1356 -0
  12. mypy/checkpattern.py +801 -0
  13. mypy/checkstrformat.py +1109 -0
  14. mypy/config_parser.py +670 -0
  15. mypy/constant_fold.py +187 -0
  16. mypy/constraints.py +1624 -0
  17. mypy/copytype.py +133 -0
  18. mypy/defaults.py +46 -0
  19. mypy/dmypy/__init__.py +0 -0
  20. mypy/dmypy/__main__.py +6 -0
  21. mypy/dmypy/client.py +749 -0
  22. mypy/dmypy_os.py +42 -0
  23. mypy/dmypy_server.py +1107 -0
  24. mypy/dmypy_util.py +117 -0
  25. mypy/erasetype.py +278 -0
  26. mypy/errorcodes.py +285 -0
  27. mypy/errors.py +1280 -0
  28. mypy/evalexpr.py +205 -0
  29. mypy/expandtype.py +510 -0
  30. mypy/exprtotype.py +206 -0
  31. mypy/fastparse.py +2147 -0
  32. mypy/find_sources.py +243 -0
  33. mypy/fixup.py +426 -0
  34. mypy/freetree.py +23 -0
  35. mypy/fscache.py +309 -0
  36. mypy/fswatcher.py +106 -0
  37. mypy/gclogger.py +47 -0
  38. mypy/git.py +34 -0
  39. mypy/graph_utils.py +112 -0
  40. mypy/indirection.py +121 -0
  41. mypy/infer.py +75 -0
  42. mypy/inspections.py +627 -0
  43. mypy/ipc.py +310 -0
  44. mypy/join.py +866 -0
  45. mypy/literals.py +306 -0
  46. mypy/lookup.py +61 -0
  47. mypy/main.py +1574 -0
  48. mypy/maptype.py +106 -0
  49. mypy/meet.py +1140 -0
  50. mypy/memprofile.py +121 -0
  51. mypy/message_registry.py +326 -0
  52. mypy/messages.py +3171 -0
  53. mypy/metastore.py +225 -0
  54. mypy/mixedtraverser.py +112 -0
  55. mypy/modulefinder.py +875 -0
  56. mypy/moduleinspect.py +184 -0
  57. mypy/mro.py +62 -0
  58. mypy/nodes.py +4112 -0
  59. mypy/operators.py +126 -0
  60. mypy/options.py +556 -0
  61. mypy/parse.py +30 -0
  62. mypy/partially_defined.py +675 -0
  63. mypy/patterns.py +150 -0
  64. mypy/plugin.py +901 -0
  65. mypy/plugins/__init__.py +0 -0
  66. mypy/plugins/attrs.py +1152 -0
  67. mypy/plugins/common.py +440 -0
  68. mypy/plugins/ctypes.py +245 -0
  69. mypy/plugins/dataclasses.py +1101 -0
  70. mypy/plugins/default.py +518 -0
  71. mypy/plugins/enums.py +259 -0
  72. mypy/plugins/functools.py +104 -0
  73. mypy/plugins/proper_plugin.py +175 -0
  74. mypy/plugins/singledispatch.py +224 -0
  75. mypy/py.typed +1 -0
  76. mypy/pyinfo.py +78 -0
  77. mypy/reachability.py +362 -0
  78. mypy/refinfo.py +92 -0
  79. mypy/renaming.py +568 -0
  80. mypy/report.py +924 -0
  81. mypy/scope.py +125 -0
  82. mypy/semanal.py +7023 -0
  83. mypy/semanal_classprop.py +187 -0
  84. mypy/semanal_enum.py +253 -0
  85. mypy/semanal_infer.py +128 -0
  86. mypy/semanal_main.py +511 -0
  87. mypy/semanal_namedtuple.py +670 -0
  88. mypy/semanal_newtype.py +273 -0
  89. mypy/semanal_pass1.py +156 -0
  90. mypy/semanal_shared.py +490 -0
  91. mypy/semanal_typeargs.py +265 -0
  92. mypy/semanal_typeddict.py +575 -0
  93. mypy/server/__init__.py +0 -0
  94. mypy/server/astdiff.py +518 -0
  95. mypy/server/astmerge.py +562 -0
  96. mypy/server/aststrip.py +281 -0
  97. mypy/server/deps.py +1137 -0
  98. mypy/server/mergecheck.py +83 -0
  99. mypy/server/objgraph.py +101 -0
  100. mypy/server/subexpr.py +198 -0
  101. mypy/server/target.py +11 -0
  102. mypy/server/trigger.py +26 -0
  103. mypy/server/update.py +1339 -0
  104. mypy/sharedparse.py +112 -0
  105. mypy/solve.py +562 -0
  106. mypy/split_namespace.py +35 -0
  107. mypy/state.py +28 -0
  108. mypy/stats.py +489 -0
  109. mypy/strconv.py +641 -0
  110. mypy/stubdoc.py +491 -0
  111. mypy/stubgen.py +1873 -0
  112. mypy/stubgenc.py +993 -0
  113. mypy/stubinfo.py +173 -0
  114. mypy/stubtest.py +2079 -0
  115. mypy/stubutil.py +807 -0
  116. mypy/subtypes.py +1967 -0
  117. mypy/suggestions.py +1046 -0
  118. mypy/test/__init__.py +0 -0
  119. mypy/test/config.py +28 -0
  120. mypy/test/data.py +823 -0
  121. mypy/test/helpers.py +476 -0
  122. mypy/test/meta/__init__.py +0 -0
  123. mypy/test/meta/_pytest.py +72 -0
  124. mypy/test/meta/test_diff_helper.py +47 -0
  125. mypy/test/meta/test_parse_data.py +73 -0
  126. mypy/test/meta/test_update_data.py +135 -0
  127. mypy/test/test_find_sources.py +376 -0
  128. mypy/test/test_ref_info.py +45 -0
  129. mypy/test/testapi.py +45 -0
  130. mypy/test/testargs.py +77 -0
  131. mypy/test/testcheck.py +322 -0
  132. mypy/test/testcmdline.py +152 -0
  133. mypy/test/testconstraints.py +134 -0
  134. mypy/test/testdaemon.py +132 -0
  135. mypy/test/testdeps.py +77 -0
  136. mypy/test/testdiff.py +67 -0
  137. mypy/test/testerrorstream.py +46 -0
  138. mypy/test/testfinegrained.py +438 -0
  139. mypy/test/testfinegrainedcache.py +18 -0
  140. mypy/test/testformatter.py +85 -0
  141. mypy/test/testfscache.py +101 -0
  142. mypy/test/testgraph.py +83 -0
  143. mypy/test/testinfer.py +373 -0
  144. mypy/test/testipc.py +119 -0
  145. mypy/test/testmerge.py +238 -0
  146. mypy/test/testmodulefinder.py +278 -0
  147. mypy/test/testmypyc.py +14 -0
  148. mypy/test/testparse.py +107 -0
  149. mypy/test/testpep561.py +211 -0
  150. mypy/test/testpythoneval.py +117 -0
  151. mypy/test/testreports.py +55 -0
  152. mypy/test/testsemanal.py +209 -0
  153. mypy/test/testsolve.py +285 -0
  154. mypy/test/teststubgen.py +1412 -0
  155. mypy/test/teststubinfo.py +12 -0
  156. mypy/test/teststubtest.py +2492 -0
  157. mypy/test/testsubtypes.py +303 -0
  158. mypy/test/testtransform.py +64 -0
  159. mypy/test/testtypegen.py +83 -0
  160. mypy/test/testtypes.py +1551 -0
  161. mypy/test/testutil.py +111 -0
  162. mypy/test/typefixture.py +415 -0
  163. mypy/test/update_data.py +87 -0
  164. mypy/test/visitors.py +63 -0
  165. mypy/traverser.py +961 -0
  166. mypy/treetransform.py +800 -0
  167. mypy/tvar_scope.py +147 -0
  168. mypy/type_visitor.py +564 -0
  169. mypy/typeanal.py +2510 -0
  170. mypy/typeops.py +1082 -0
  171. mypy/types.py +3686 -0
  172. mypy/types_utils.py +166 -0
  173. mypy/typeshed/LICENSE +237 -0
  174. mypy/typeshed/stdlib/VERSIONS +308 -0
  175. mypy/typeshed/stdlib/__future__.pyi +36 -0
  176. mypy/typeshed/stdlib/__main__.pyi +3 -0
  177. mypy/typeshed/stdlib/_ast.pyi +587 -0
  178. mypy/typeshed/stdlib/_bisect.pyi +84 -0
  179. mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
  180. mypy/typeshed/stdlib/_codecs.pyi +133 -0
  181. mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
  182. mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
  183. mypy/typeshed/stdlib/_compression.pyi +25 -0
  184. mypy/typeshed/stdlib/_csv.pyi +90 -0
  185. mypy/typeshed/stdlib/_ctypes.pyi +205 -0
  186. mypy/typeshed/stdlib/_curses.pyi +557 -0
  187. mypy/typeshed/stdlib/_decimal.pyi +281 -0
  188. mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
  189. mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
  190. mypy/typeshed/stdlib/_heapq.pyi +11 -0
  191. mypy/typeshed/stdlib/_imp.pyi +28 -0
  192. mypy/typeshed/stdlib/_json.pyi +49 -0
  193. mypy/typeshed/stdlib/_locale.pyi +100 -0
  194. mypy/typeshed/stdlib/_markupbase.pyi +16 -0
  195. mypy/typeshed/stdlib/_msi.pyi +91 -0
  196. mypy/typeshed/stdlib/_operator.pyi +147 -0
  197. mypy/typeshed/stdlib/_osx_support.pyi +34 -0
  198. mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
  199. mypy/typeshed/stdlib/_py_abc.pyi +14 -0
  200. mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
  201. mypy/typeshed/stdlib/_random.pyi +12 -0
  202. mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
  203. mypy/typeshed/stdlib/_socket.pyi +802 -0
  204. mypy/typeshed/stdlib/_stat.pyi +103 -0
  205. mypy/typeshed/stdlib/_thread.pyi +52 -0
  206. mypy/typeshed/stdlib/_threading_local.pyi +17 -0
  207. mypy/typeshed/stdlib/_tkinter.pyi +120 -0
  208. mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
  209. mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
  210. mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
  211. mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
  212. mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
  213. mypy/typeshed/stdlib/_warnings.pyi +55 -0
  214. mypy/typeshed/stdlib/_weakref.pyi +41 -0
  215. mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
  216. mypy/typeshed/stdlib/_winapi.pyi +251 -0
  217. mypy/typeshed/stdlib/abc.pyi +49 -0
  218. mypy/typeshed/stdlib/aifc.pyi +91 -0
  219. mypy/typeshed/stdlib/antigravity.pyi +3 -0
  220. mypy/typeshed/stdlib/argparse.pyi +571 -0
  221. mypy/typeshed/stdlib/array.pyi +92 -0
  222. mypy/typeshed/stdlib/ast.pyi +277 -0
  223. mypy/typeshed/stdlib/asynchat.pyi +21 -0
  224. mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
  225. mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
  226. mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
  227. mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
  228. mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
  229. mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
  230. mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
  231. mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
  232. mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
  233. mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
  234. mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
  235. mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
  236. mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
  237. mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
  238. mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
  239. mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
  240. mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
  241. mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
  242. mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
  243. mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
  244. mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
  245. mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
  246. mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
  247. mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
  248. mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
  249. mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
  250. mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
  251. mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
  252. mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
  253. mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
  254. mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
  255. mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
  256. mypy/typeshed/stdlib/asyncore.pyi +90 -0
  257. mypy/typeshed/stdlib/atexit.pyi +12 -0
  258. mypy/typeshed/stdlib/audioop.pyi +42 -0
  259. mypy/typeshed/stdlib/base64.pyi +59 -0
  260. mypy/typeshed/stdlib/bdb.pyi +102 -0
  261. mypy/typeshed/stdlib/binascii.pyi +36 -0
  262. mypy/typeshed/stdlib/binhex.pyi +45 -0
  263. mypy/typeshed/stdlib/bisect.pyi +4 -0
  264. mypy/typeshed/stdlib/builtins.pyi +1937 -0
  265. mypy/typeshed/stdlib/bz2.pyi +146 -0
  266. mypy/typeshed/stdlib/cProfile.pyi +35 -0
  267. mypy/typeshed/stdlib/calendar.pyi +206 -0
  268. mypy/typeshed/stdlib/cgi.pyi +118 -0
  269. mypy/typeshed/stdlib/cgitb.pyi +32 -0
  270. mypy/typeshed/stdlib/chunk.pyi +20 -0
  271. mypy/typeshed/stdlib/cmath.pyi +36 -0
  272. mypy/typeshed/stdlib/cmd.pyi +45 -0
  273. mypy/typeshed/stdlib/code.pyi +33 -0
  274. mypy/typeshed/stdlib/codecs.pyi +285 -0
  275. mypy/typeshed/stdlib/codeop.pyi +13 -0
  276. mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
  277. mypy/typeshed/stdlib/collections/abc.pyi +2 -0
  278. mypy/typeshed/stdlib/colorsys.pyi +13 -0
  279. mypy/typeshed/stdlib/compileall.pyi +111 -0
  280. mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
  281. mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
  282. mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
  283. mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
  284. mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
  285. mypy/typeshed/stdlib/configparser.pyi +313 -0
  286. mypy/typeshed/stdlib/contextlib.pyi +207 -0
  287. mypy/typeshed/stdlib/contextvars.pyi +63 -0
  288. mypy/typeshed/stdlib/copy.pyi +16 -0
  289. mypy/typeshed/stdlib/copyreg.pyi +21 -0
  290. mypy/typeshed/stdlib/crypt.pyi +12 -0
  291. mypy/typeshed/stdlib/csv.pyi +147 -0
  292. mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
  293. mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
  294. mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
  295. mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
  296. mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
  297. mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
  298. mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
  299. mypy/typeshed/stdlib/curses/panel.pyi +25 -0
  300. mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
  301. mypy/typeshed/stdlib/dataclasses.pyi +313 -0
  302. mypy/typeshed/stdlib/datetime.pyi +295 -0
  303. mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
  304. mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
  305. mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
  306. mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
  307. mypy/typeshed/stdlib/decimal.pyi +2 -0
  308. mypy/typeshed/stdlib/difflib.pyi +140 -0
  309. mypy/typeshed/stdlib/dis.pyi +144 -0
  310. mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
  311. mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
  312. mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
  313. mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
  314. mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
  315. mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
  316. mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
  317. mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
  318. mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
  319. mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
  320. mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
  321. mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
  322. mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
  323. mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
  324. mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
  325. mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
  326. mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
  327. mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
  328. mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
  329. mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
  330. mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
  331. mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
  332. mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
  333. mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
  334. mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
  335. mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
  336. mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
  337. mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
  338. mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
  339. mypy/typeshed/stdlib/distutils/config.pyi +17 -0
  340. mypy/typeshed/stdlib/distutils/core.pyi +57 -0
  341. mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
  342. mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
  343. mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
  344. mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
  345. mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
  346. mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
  347. mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
  348. mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
  349. mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
  350. mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
  351. mypy/typeshed/stdlib/distutils/log.pyi +25 -0
  352. mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
  353. mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
  354. mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
  355. mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
  356. mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
  357. mypy/typeshed/stdlib/distutils/util.pyi +46 -0
  358. mypy/typeshed/stdlib/distutils/version.pyi +36 -0
  359. mypy/typeshed/stdlib/doctest.pyi +248 -0
  360. mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
  361. mypy/typeshed/stdlib/email/__init__.pyi +29 -0
  362. mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
  363. mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
  364. mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
  365. mypy/typeshed/stdlib/email/charset.pyi +34 -0
  366. mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
  367. mypy/typeshed/stdlib/email/encoders.pyi +8 -0
  368. mypy/typeshed/stdlib/email/errors.pyi +39 -0
  369. mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
  370. mypy/typeshed/stdlib/email/generator.pyi +40 -0
  371. mypy/typeshed/stdlib/email/header.pyi +31 -0
  372. mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
  373. mypy/typeshed/stdlib/email/iterators.pyi +12 -0
  374. mypy/typeshed/stdlib/email/message.pyi +161 -0
  375. mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
  376. mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
  377. mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
  378. mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
  379. mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
  380. mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
  381. mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
  382. mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
  383. mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
  384. mypy/typeshed/stdlib/email/parser.pyi +26 -0
  385. mypy/typeshed/stdlib/email/policy.pyi +38 -0
  386. mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
  387. mypy/typeshed/stdlib/email/utils.pyi +66 -0
  388. mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
  389. mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
  390. mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
  391. mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
  392. mypy/typeshed/stdlib/enum.pyi +317 -0
  393. mypy/typeshed/stdlib/errno.pyi +222 -0
  394. mypy/typeshed/stdlib/faulthandler.pyi +13 -0
  395. mypy/typeshed/stdlib/fcntl.pyi +127 -0
  396. mypy/typeshed/stdlib/filecmp.pyi +57 -0
  397. mypy/typeshed/stdlib/fileinput.pyi +213 -0
  398. mypy/typeshed/stdlib/fnmatch.pyi +9 -0
  399. mypy/typeshed/stdlib/formatter.pyi +88 -0
  400. mypy/typeshed/stdlib/fractions.pyi +150 -0
  401. mypy/typeshed/stdlib/ftplib.pyi +178 -0
  402. mypy/typeshed/stdlib/functools.pyi +200 -0
  403. mypy/typeshed/stdlib/gc.pyi +37 -0
  404. mypy/typeshed/stdlib/genericpath.pyi +52 -0
  405. mypy/typeshed/stdlib/getopt.pyi +11 -0
  406. mypy/typeshed/stdlib/getpass.pyi +8 -0
  407. mypy/typeshed/stdlib/gettext.pyi +169 -0
  408. mypy/typeshed/stdlib/glob.pyi +42 -0
  409. mypy/typeshed/stdlib/graphlib.pyi +28 -0
  410. mypy/typeshed/stdlib/grp.pyi +21 -0
  411. mypy/typeshed/stdlib/gzip.pyi +160 -0
  412. mypy/typeshed/stdlib/hashlib.pyi +165 -0
  413. mypy/typeshed/stdlib/heapq.pyi +17 -0
  414. mypy/typeshed/stdlib/hmac.pyi +38 -0
  415. mypy/typeshed/stdlib/html/__init__.pyi +6 -0
  416. mypy/typeshed/stdlib/html/entities.pyi +6 -0
  417. mypy/typeshed/stdlib/html/parser.pyi +34 -0
  418. mypy/typeshed/stdlib/http/__init__.pyi +105 -0
  419. mypy/typeshed/stdlib/http/client.pyi +259 -0
  420. mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
  421. mypy/typeshed/stdlib/http/cookies.pyi +60 -0
  422. mypy/typeshed/stdlib/http/server.pyi +83 -0
  423. mypy/typeshed/stdlib/imaplib.pyi +168 -0
  424. mypy/typeshed/stdlib/imghdr.pyi +17 -0
  425. mypy/typeshed/stdlib/imp.pyi +62 -0
  426. mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
  427. mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
  428. mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
  429. mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
  430. mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
  431. mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
  432. mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
  433. mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
  434. mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
  435. mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
  436. mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
  437. mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
  438. mypy/typeshed/stdlib/importlib/util.pyi +43 -0
  439. mypy/typeshed/stdlib/inspect.pyi +631 -0
  440. mypy/typeshed/stdlib/io.pyi +204 -0
  441. mypy/typeshed/stdlib/ipaddress.pyi +208 -0
  442. mypy/typeshed/stdlib/itertools.pyi +293 -0
  443. mypy/typeshed/stdlib/json/__init__.pyi +61 -0
  444. mypy/typeshed/stdlib/json/decoder.pyi +32 -0
  445. mypy/typeshed/stdlib/json/encoder.pyi +38 -0
  446. mypy/typeshed/stdlib/json/tool.pyi +1 -0
  447. mypy/typeshed/stdlib/keyword.pyi +21 -0
  448. mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
  449. mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
  450. mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
  451. mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
  452. mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
  453. mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
  454. mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
  455. mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
  456. mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
  457. mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
  458. mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
  459. mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
  460. mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
  461. mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
  462. mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
  463. mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
  464. mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
  465. mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
  466. mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
  467. mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
  468. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
  469. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
  470. mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
  471. mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
  472. mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
  473. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
  474. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
  475. mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
  476. mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
  477. mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
  478. mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
  479. mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
  480. mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
  481. mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
  482. mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
  483. mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
  484. mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
  485. mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
  486. mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
  487. mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
  488. mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
  489. mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
  490. mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
  491. mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
  492. mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
  493. mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
  494. mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
  495. mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
  496. mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
  497. mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
  498. mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
  499. mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
  500. mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
  501. mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
  502. mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
  503. mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
  504. mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
  505. mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
  506. mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
  507. mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
  508. mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
  509. mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
  510. mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
  511. mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
  512. mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
  513. mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
  514. mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
  515. mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
  516. mypy/typeshed/stdlib/linecache.pyi +23 -0
  517. mypy/typeshed/stdlib/locale.pyi +152 -0
  518. mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
  519. mypy/typeshed/stdlib/logging/config.pyi +134 -0
  520. mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
  521. mypy/typeshed/stdlib/lzma.pyi +197 -0
  522. mypy/typeshed/stdlib/mailbox.pyi +256 -0
  523. mypy/typeshed/stdlib/mailcap.pyi +11 -0
  524. mypy/typeshed/stdlib/marshal.pyi +33 -0
  525. mypy/typeshed/stdlib/math.pyi +125 -0
  526. mypy/typeshed/stdlib/mimetypes.pyi +46 -0
  527. mypy/typeshed/stdlib/mmap.pyi +113 -0
  528. mypy/typeshed/stdlib/modulefinder.pyi +66 -0
  529. mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
  530. mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
  531. mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
  532. mypy/typeshed/stdlib/msilib/text.pyi +7 -0
  533. mypy/typeshed/stdlib/msvcrt.pyi +32 -0
  534. mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
  535. mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
  536. mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
  537. mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
  538. mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
  539. mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
  540. mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
  541. mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
  542. mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
  543. mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
  544. mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
  545. mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
  546. mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
  547. mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
  548. mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
  549. mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
  550. mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
  551. mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
  552. mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
  553. mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
  554. mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
  555. mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
  556. mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
  557. mypy/typeshed/stdlib/netrc.pyi +23 -0
  558. mypy/typeshed/stdlib/nis.pyi +9 -0
  559. mypy/typeshed/stdlib/nntplib.pyi +125 -0
  560. mypy/typeshed/stdlib/nt.pyi +111 -0
  561. mypy/typeshed/stdlib/ntpath.pyi +119 -0
  562. mypy/typeshed/stdlib/nturl2path.pyi +2 -0
  563. mypy/typeshed/stdlib/numbers.pyi +154 -0
  564. mypy/typeshed/stdlib/opcode.pyi +59 -0
  565. mypy/typeshed/stdlib/operator.pyi +110 -0
  566. mypy/typeshed/stdlib/optparse.pyi +252 -0
  567. mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
  568. mypy/typeshed/stdlib/os/path.pyi +8 -0
  569. mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
  570. mypy/typeshed/stdlib/parser.pyi +24 -0
  571. mypy/typeshed/stdlib/pathlib.pyi +232 -0
  572. mypy/typeshed/stdlib/pdb.pyi +181 -0
  573. mypy/typeshed/stdlib/pickle.pyi +270 -0
  574. mypy/typeshed/stdlib/pickletools.pyi +167 -0
  575. mypy/typeshed/stdlib/pipes.pyi +16 -0
  576. mypy/typeshed/stdlib/pkgutil.pyi +53 -0
  577. mypy/typeshed/stdlib/platform.pyi +42 -0
  578. mypy/typeshed/stdlib/plistlib.pyi +113 -0
  579. mypy/typeshed/stdlib/poplib.pyi +71 -0
  580. mypy/typeshed/stdlib/posix.pyi +359 -0
  581. mypy/typeshed/stdlib/posixpath.pyi +161 -0
  582. mypy/typeshed/stdlib/pprint.pyi +112 -0
  583. mypy/typeshed/stdlib/profile.pyi +31 -0
  584. mypy/typeshed/stdlib/pstats.pyi +78 -0
  585. mypy/typeshed/stdlib/pty.pyi +19 -0
  586. mypy/typeshed/stdlib/pwd.pyi +27 -0
  587. mypy/typeshed/stdlib/py_compile.pyi +34 -0
  588. mypy/typeshed/stdlib/pyclbr.pyi +74 -0
  589. mypy/typeshed/stdlib/pydoc.pyi +261 -0
  590. mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
  591. mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
  592. mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
  593. mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
  594. mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
  595. mypy/typeshed/stdlib/queue.pyi +58 -0
  596. mypy/typeshed/stdlib/quopri.pyi +11 -0
  597. mypy/typeshed/stdlib/random.pyi +138 -0
  598. mypy/typeshed/stdlib/re.pyi +290 -0
  599. mypy/typeshed/stdlib/readline.pyi +36 -0
  600. mypy/typeshed/stdlib/reprlib.pyi +65 -0
  601. mypy/typeshed/stdlib/resource.pyi +92 -0
  602. mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
  603. mypy/typeshed/stdlib/runpy.pyi +24 -0
  604. mypy/typeshed/stdlib/sched.pyi +42 -0
  605. mypy/typeshed/stdlib/secrets.pyi +15 -0
  606. mypy/typeshed/stdlib/select.pyi +151 -0
  607. mypy/typeshed/stdlib/selectors.pyi +67 -0
  608. mypy/typeshed/stdlib/shelve.pyi +46 -0
  609. mypy/typeshed/stdlib/shlex.pyi +43 -0
  610. mypy/typeshed/stdlib/shutil.pyi +189 -0
  611. mypy/typeshed/stdlib/signal.pyi +189 -0
  612. mypy/typeshed/stdlib/site.pyi +27 -0
  613. mypy/typeshed/stdlib/smtpd.pyi +91 -0
  614. mypy/typeshed/stdlib/smtplib.pyi +204 -0
  615. mypy/typeshed/stdlib/sndhdr.pyi +14 -0
  616. mypy/typeshed/stdlib/socket.pyi +825 -0
  617. mypy/typeshed/stdlib/socketserver.pyi +168 -0
  618. mypy/typeshed/stdlib/spwd.pyi +40 -0
  619. mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
  620. mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
  621. mypy/typeshed/stdlib/sre_compile.pyi +11 -0
  622. mypy/typeshed/stdlib/sre_constants.pyi +130 -0
  623. mypy/typeshed/stdlib/sre_parse.pyi +104 -0
  624. mypy/typeshed/stdlib/ssl.pyi +529 -0
  625. mypy/typeshed/stdlib/stat.pyi +1 -0
  626. mypy/typeshed/stdlib/statistics.pyi +132 -0
  627. mypy/typeshed/stdlib/string.pyi +83 -0
  628. mypy/typeshed/stdlib/stringprep.pyi +27 -0
  629. mypy/typeshed/stdlib/struct.pyi +26 -0
  630. mypy/typeshed/stdlib/subprocess.pyi +2614 -0
  631. mypy/typeshed/stdlib/sunau.pyi +86 -0
  632. mypy/typeshed/stdlib/symbol.pyi +93 -0
  633. mypy/typeshed/stdlib/symtable.pyi +58 -0
  634. mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
  635. mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
  636. mypy/typeshed/stdlib/sysconfig.pyi +43 -0
  637. mypy/typeshed/stdlib/syslog.pyi +46 -0
  638. mypy/typeshed/stdlib/tabnanny.pyi +16 -0
  639. mypy/typeshed/stdlib/tarfile.pyi +438 -0
  640. mypy/typeshed/stdlib/telnetlib.pyi +122 -0
  641. mypy/typeshed/stdlib/tempfile.pyi +477 -0
  642. mypy/typeshed/stdlib/termios.pyi +267 -0
  643. mypy/typeshed/stdlib/textwrap.pyi +103 -0
  644. mypy/typeshed/stdlib/this.pyi +2 -0
  645. mypy/typeshed/stdlib/threading.pyi +187 -0
  646. mypy/typeshed/stdlib/time.pyi +107 -0
  647. mypy/typeshed/stdlib/timeit.pyi +32 -0
  648. mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
  649. mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
  650. mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
  651. mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
  652. mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
  653. mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
  654. mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
  655. mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
  656. mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
  657. mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
  658. mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
  659. mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
  660. mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
  661. mypy/typeshed/stdlib/token.pyi +159 -0
  662. mypy/typeshed/stdlib/tokenize.pyi +177 -0
  663. mypy/typeshed/stdlib/tomllib.pyi +10 -0
  664. mypy/typeshed/stdlib/trace.pyi +79 -0
  665. mypy/typeshed/stdlib/traceback.pyi +260 -0
  666. mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
  667. mypy/typeshed/stdlib/tty.pyi +30 -0
  668. mypy/typeshed/stdlib/turtle.pyi +713 -0
  669. mypy/typeshed/stdlib/types.pyi +605 -0
  670. mypy/typeshed/stdlib/typing.pyi +968 -0
  671. mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
  672. mypy/typeshed/stdlib/unicodedata.pyi +71 -0
  673. mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
  674. mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
  675. mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
  676. mypy/typeshed/stdlib/unittest/case.pyi +342 -0
  677. mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
  678. mypy/typeshed/stdlib/unittest/main.pyi +69 -0
  679. mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
  680. mypy/typeshed/stdlib/unittest/result.pyi +46 -0
  681. mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
  682. mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
  683. mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
  684. mypy/typeshed/stdlib/unittest/util.pyi +23 -0
  685. mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
  686. mypy/typeshed/stdlib/urllib/error.pyi +23 -0
  687. mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
  688. mypy/typeshed/stdlib/urllib/request.pyi +399 -0
  689. mypy/typeshed/stdlib/urllib/response.pyi +43 -0
  690. mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
  691. mypy/typeshed/stdlib/uu.pyi +13 -0
  692. mypy/typeshed/stdlib/uuid.pyi +100 -0
  693. mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
  694. mypy/typeshed/stdlib/warnings.pyi +112 -0
  695. mypy/typeshed/stdlib/wave.pyi +85 -0
  696. mypy/typeshed/stdlib/weakref.pyi +150 -0
  697. mypy/typeshed/stdlib/webbrowser.pyi +74 -0
  698. mypy/typeshed/stdlib/winreg.pyi +103 -0
  699. mypy/typeshed/stdlib/winsound.pyi +28 -0
  700. mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
  701. mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
  702. mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
  703. mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
  704. mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
  705. mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
  706. mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
  707. mypy/typeshed/stdlib/xdrlib.pyi +57 -0
  708. mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
  709. mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
  710. mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
  711. mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
  712. mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
  713. mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
  714. mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
  715. mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
  716. mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
  717. mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
  718. mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
  719. mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
  720. mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
  721. mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
  722. mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
  723. mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
  724. mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
  725. mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
  726. mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
  727. mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
  728. mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
  729. mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
  730. mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
  731. mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
  732. mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
  733. mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
  734. mypy/typeshed/stdlib/xxlimited.pyi +22 -0
  735. mypy/typeshed/stdlib/zipapp.pyi +20 -0
  736. mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
  737. mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
  738. mypy/typeshed/stdlib/zipimport.pyi +32 -0
  739. mypy/typeshed/stdlib/zlib.pyi +56 -0
  740. mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
  741. mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
  742. mypy/typestate.py +323 -0
  743. mypy/typetraverser.py +142 -0
  744. mypy/typevars.py +93 -0
  745. mypy/typevartuples.py +32 -0
  746. mypy/util.py +869 -0
  747. mypy/version.py +1 -0
  748. mypy/visitor.py +621 -0
  749. mypy/xml/mypy-html.css +104 -0
  750. mypy/xml/mypy-html.xslt +81 -0
  751. mypy/xml/mypy-txt.xslt +100 -0
  752. mypy/xml/mypy.xsd +50 -0
  753. mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
  754. mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
  755. mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
  756. mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
  757. mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
  758. mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
  759. mypyc/README.md +133 -0
  760. mypyc/__init__.py +0 -0
  761. mypyc/__main__.py +57 -0
  762. mypyc/analysis/__init__.py +0 -0
  763. mypyc/analysis/attrdefined.py +436 -0
  764. mypyc/analysis/blockfreq.py +32 -0
  765. mypyc/analysis/dataflow.py +624 -0
  766. mypyc/analysis/ircheck.py +429 -0
  767. mypyc/analysis/selfleaks.py +207 -0
  768. mypyc/build.py +616 -0
  769. mypyc/codegen/__init__.py +0 -0
  770. mypyc/codegen/cstring.py +54 -0
  771. mypyc/codegen/emit.py +1193 -0
  772. mypyc/codegen/emitclass.py +1060 -0
  773. mypyc/codegen/emitfunc.py +846 -0
  774. mypyc/codegen/emitmodule.py +1131 -0
  775. mypyc/codegen/emitwrapper.py +979 -0
  776. mypyc/codegen/literals.py +302 -0
  777. mypyc/common.py +136 -0
  778. mypyc/crash.py +31 -0
  779. mypyc/doc/Makefile +20 -0
  780. mypyc/doc/bool_operations.rst +27 -0
  781. mypyc/doc/compilation_units.rst +20 -0
  782. mypyc/doc/conf.py +59 -0
  783. mypyc/doc/cpython-timings.md +25 -0
  784. mypyc/doc/dev-intro.md +548 -0
  785. mypyc/doc/dict_operations.rst +59 -0
  786. mypyc/doc/differences_from_python.rst +332 -0
  787. mypyc/doc/float_operations.rst +50 -0
  788. mypyc/doc/future.md +42 -0
  789. mypyc/doc/getting_started.rst +240 -0
  790. mypyc/doc/index.rst +61 -0
  791. mypyc/doc/int_operations.rst +162 -0
  792. mypyc/doc/introduction.rst +150 -0
  793. mypyc/doc/list_operations.rst +65 -0
  794. mypyc/doc/make.bat +35 -0
  795. mypyc/doc/native_classes.rst +206 -0
  796. mypyc/doc/native_operations.rst +55 -0
  797. mypyc/doc/performance_tips_and_tricks.rst +244 -0
  798. mypyc/doc/set_operations.rst +47 -0
  799. mypyc/doc/str_operations.rst +35 -0
  800. mypyc/doc/tuple_operations.rst +33 -0
  801. mypyc/doc/using_type_annotations.rst +398 -0
  802. mypyc/errors.py +29 -0
  803. mypyc/external/googletest/LICENSE +28 -0
  804. mypyc/external/googletest/README.md +280 -0
  805. mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
  806. mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
  807. mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
  808. mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
  809. mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
  810. mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
  811. mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
  812. mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
  813. mypyc/external/googletest/include/gtest/gtest.h +2236 -0
  814. mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
  815. mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
  816. mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
  817. mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  818. mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
  819. mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  820. mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
  821. mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
  822. mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  823. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
  824. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
  825. mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
  826. mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
  827. mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
  828. mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
  829. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  830. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  831. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
  832. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  833. mypyc/external/googletest/make/Makefile +61 -0
  834. mypyc/external/googletest/src/gtest-all.cc +48 -0
  835. mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
  836. mypyc/external/googletest/src/gtest-filepath.cc +387 -0
  837. mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
  838. mypyc/external/googletest/src/gtest-port.cc +1259 -0
  839. mypyc/external/googletest/src/gtest-printers.cc +373 -0
  840. mypyc/external/googletest/src/gtest-test-part.cc +110 -0
  841. mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
  842. mypyc/external/googletest/src/gtest.cc +5388 -0
  843. mypyc/external/googletest/src/gtest_main.cc +38 -0
  844. mypyc/ir/__init__.py +0 -0
  845. mypyc/ir/class_ir.py +499 -0
  846. mypyc/ir/func_ir.py +370 -0
  847. mypyc/ir/module_ir.py +88 -0
  848. mypyc/ir/ops.py +1642 -0
  849. mypyc/ir/pprint.py +496 -0
  850. mypyc/ir/rtypes.py +1038 -0
  851. mypyc/irbuild/__init__.py +0 -0
  852. mypyc/irbuild/ast_helpers.py +120 -0
  853. mypyc/irbuild/builder.py +1398 -0
  854. mypyc/irbuild/callable_class.py +173 -0
  855. mypyc/irbuild/classdef.py +850 -0
  856. mypyc/irbuild/constant_fold.py +95 -0
  857. mypyc/irbuild/context.py +186 -0
  858. mypyc/irbuild/env_class.py +223 -0
  859. mypyc/irbuild/expression.py +1067 -0
  860. mypyc/irbuild/for_helpers.py +1046 -0
  861. mypyc/irbuild/format_str_tokenizer.py +250 -0
  862. mypyc/irbuild/function.py +1089 -0
  863. mypyc/irbuild/generator.py +346 -0
  864. mypyc/irbuild/ll_builder.py +2407 -0
  865. mypyc/irbuild/main.py +153 -0
  866. mypyc/irbuild/mapper.py +221 -0
  867. mypyc/irbuild/match.py +355 -0
  868. mypyc/irbuild/nonlocalcontrol.py +197 -0
  869. mypyc/irbuild/prebuildvisitor.py +203 -0
  870. mypyc/irbuild/prepare.py +609 -0
  871. mypyc/irbuild/specialize.py +822 -0
  872. mypyc/irbuild/statement.py +1017 -0
  873. mypyc/irbuild/targets.py +57 -0
  874. mypyc/irbuild/util.py +189 -0
  875. mypyc/irbuild/visitor.py +401 -0
  876. mypyc/irbuild/vtable.py +82 -0
  877. mypyc/lib-rt/CPy.h +643 -0
  878. mypyc/lib-rt/bytes_ops.c +143 -0
  879. mypyc/lib-rt/dict_ops.c +446 -0
  880. mypyc/lib-rt/exc_ops.c +259 -0
  881. mypyc/lib-rt/float_ops.c +192 -0
  882. mypyc/lib-rt/generic_ops.c +64 -0
  883. mypyc/lib-rt/getargs.c +450 -0
  884. mypyc/lib-rt/getargsfast.c +569 -0
  885. mypyc/lib-rt/init.c +13 -0
  886. mypyc/lib-rt/int_ops.c +803 -0
  887. mypyc/lib-rt/list_ops.c +335 -0
  888. mypyc/lib-rt/misc_ops.c +942 -0
  889. mypyc/lib-rt/module_shim.tmpl +18 -0
  890. mypyc/lib-rt/mypyc_util.h +118 -0
  891. mypyc/lib-rt/pythoncapi_compat.h +497 -0
  892. mypyc/lib-rt/pythonsupport.h +548 -0
  893. mypyc/lib-rt/set_ops.c +17 -0
  894. mypyc/lib-rt/setup.py +70 -0
  895. mypyc/lib-rt/str_ops.c +241 -0
  896. mypyc/lib-rt/test_capi.cc +585 -0
  897. mypyc/lib-rt/tuple_ops.c +61 -0
  898. mypyc/namegen.py +115 -0
  899. mypyc/options.py +32 -0
  900. mypyc/primitives/__init__.py +0 -0
  901. mypyc/primitives/bytes_ops.py +101 -0
  902. mypyc/primitives/dict_ops.py +325 -0
  903. mypyc/primitives/exc_ops.py +101 -0
  904. mypyc/primitives/float_ops.py +168 -0
  905. mypyc/primitives/generic_ops.py +384 -0
  906. mypyc/primitives/int_ops.py +304 -0
  907. mypyc/primitives/list_ops.py +300 -0
  908. mypyc/primitives/misc_ops.py +241 -0
  909. mypyc/primitives/registry.py +323 -0
  910. mypyc/primitives/set_ops.py +121 -0
  911. mypyc/primitives/str_ops.py +229 -0
  912. mypyc/primitives/tuple_ops.py +83 -0
  913. mypyc/rt_subtype.py +77 -0
  914. mypyc/sametype.py +83 -0
  915. mypyc/subtype.py +88 -0
  916. mypyc/test/__init__.py +0 -0
  917. mypyc/test/config.py +13 -0
  918. mypyc/test/test_alwaysdefined.py +46 -0
  919. mypyc/test/test_analysis.py +77 -0
  920. mypyc/test/test_cheader.py +45 -0
  921. mypyc/test/test_commandline.py +82 -0
  922. mypyc/test/test_emit.py +69 -0
  923. mypyc/test/test_emitclass.py +35 -0
  924. mypyc/test/test_emitfunc.py +926 -0
  925. mypyc/test/test_emitwrapper.py +60 -0
  926. mypyc/test/test_exceptions.py +56 -0
  927. mypyc/test/test_external.py +49 -0
  928. mypyc/test/test_irbuild.py +87 -0
  929. mypyc/test/test_ircheck.py +199 -0
  930. mypyc/test/test_literals.py +90 -0
  931. mypyc/test/test_namegen.py +48 -0
  932. mypyc/test/test_pprint.py +42 -0
  933. mypyc/test/test_rarray.py +48 -0
  934. mypyc/test/test_refcount.py +59 -0
  935. mypyc/test/test_run.py +426 -0
  936. mypyc/test/test_serialization.py +108 -0
  937. mypyc/test/test_struct.py +112 -0
  938. mypyc/test/test_tuplename.py +33 -0
  939. mypyc/test/test_typeops.py +97 -0
  940. mypyc/test/testutil.py +283 -0
  941. mypyc/test-data/alwaysdefined.test +732 -0
  942. mypyc/test-data/analysis.test +603 -0
  943. mypyc/test-data/commandline.test +245 -0
  944. mypyc/test-data/driver/driver.py +48 -0
  945. mypyc/test-data/exceptions-freq.test +125 -0
  946. mypyc/test-data/exceptions.test +713 -0
  947. mypyc/test-data/fixtures/ir.py +373 -0
  948. mypyc/test-data/fixtures/testutil.py +103 -0
  949. mypyc/test-data/fixtures/typing-full.pyi +169 -0
  950. mypyc/test-data/irbuild-any.test +238 -0
  951. mypyc/test-data/irbuild-basic.test +3690 -0
  952. mypyc/test-data/irbuild-bool.test +463 -0
  953. mypyc/test-data/irbuild-bytes.test +184 -0
  954. mypyc/test-data/irbuild-classes.test +1303 -0
  955. mypyc/test-data/irbuild-constant-fold.test +480 -0
  956. mypyc/test-data/irbuild-dict.test +585 -0
  957. mypyc/test-data/irbuild-dunders.test +223 -0
  958. mypyc/test-data/irbuild-float.test +497 -0
  959. mypyc/test-data/irbuild-generics.test +151 -0
  960. mypyc/test-data/irbuild-glue-methods.test +437 -0
  961. mypyc/test-data/irbuild-i16.test +526 -0
  962. mypyc/test-data/irbuild-i32.test +598 -0
  963. mypyc/test-data/irbuild-i64.test +2164 -0
  964. mypyc/test-data/irbuild-int.test +235 -0
  965. mypyc/test-data/irbuild-isinstance.test +109 -0
  966. mypyc/test-data/irbuild-lists.test +547 -0
  967. mypyc/test-data/irbuild-match.test +1708 -0
  968. mypyc/test-data/irbuild-math.test +64 -0
  969. mypyc/test-data/irbuild-nested.test +807 -0
  970. mypyc/test-data/irbuild-optional.test +536 -0
  971. mypyc/test-data/irbuild-set.test +838 -0
  972. mypyc/test-data/irbuild-singledispatch.test +257 -0
  973. mypyc/test-data/irbuild-statements.test +1149 -0
  974. mypyc/test-data/irbuild-str.test +314 -0
  975. mypyc/test-data/irbuild-strip-asserts.test +12 -0
  976. mypyc/test-data/irbuild-try.test +523 -0
  977. mypyc/test-data/irbuild-tuple.test +462 -0
  978. mypyc/test-data/irbuild-u8.test +543 -0
  979. mypyc/test-data/irbuild-unreachable.test +241 -0
  980. mypyc/test-data/irbuild-vectorcall.test +153 -0
  981. mypyc/test-data/refcount.test +1588 -0
  982. mypyc/test-data/run-async.test +145 -0
  983. mypyc/test-data/run-attrs.test +318 -0
  984. mypyc/test-data/run-bench.test +196 -0
  985. mypyc/test-data/run-bools.test +229 -0
  986. mypyc/test-data/run-bytes.test +302 -0
  987. mypyc/test-data/run-classes.test +2505 -0
  988. mypyc/test-data/run-dicts.test +334 -0
  989. mypyc/test-data/run-dunders.test +945 -0
  990. mypyc/test-data/run-exceptions.test +448 -0
  991. mypyc/test-data/run-floats.test +516 -0
  992. mypyc/test-data/run-functions.test +1310 -0
  993. mypyc/test-data/run-generators.test +681 -0
  994. mypyc/test-data/run-i16.test +338 -0
  995. mypyc/test-data/run-i32.test +336 -0
  996. mypyc/test-data/run-i64.test +1519 -0
  997. mypyc/test-data/run-imports.test +265 -0
  998. mypyc/test-data/run-integers.test +540 -0
  999. mypyc/test-data/run-lists.test +411 -0
  1000. mypyc/test-data/run-loops.test +485 -0
  1001. mypyc/test-data/run-match.test +283 -0
  1002. mypyc/test-data/run-math.test +106 -0
  1003. mypyc/test-data/run-misc.test +1168 -0
  1004. mypyc/test-data/run-multimodule.test +887 -0
  1005. mypyc/test-data/run-mypy-sim.test +138 -0
  1006. mypyc/test-data/run-primitives.test +375 -0
  1007. mypyc/test-data/run-python37.test +159 -0
  1008. mypyc/test-data/run-python38.test +88 -0
  1009. mypyc/test-data/run-sets.test +150 -0
  1010. mypyc/test-data/run-singledispatch.test +698 -0
  1011. mypyc/test-data/run-strings.test +641 -0
  1012. mypyc/test-data/run-traits.test +411 -0
  1013. mypyc/test-data/run-tuples.test +258 -0
  1014. mypyc/test-data/run-u8.test +303 -0
  1015. mypyc/transform/__init__.py +0 -0
  1016. mypyc/transform/exceptions.py +182 -0
  1017. mypyc/transform/refcount.py +294 -0
  1018. mypyc/transform/uninit.py +190 -0
mypyc/ir/ops.py ADDED
@@ -0,0 +1,1642 @@
1
+ """Low-level opcodes for compiler intermediate representation (IR).
2
+
3
+ Opcodes operate on abstract values (Value) in a register machine. Each
4
+ value has a type (RType). A value can hold various things, such as:
5
+
6
+ - local variables (Register)
7
+ - intermediate values of expressions (RegisterOp subclasses)
8
+ - condition flags (true/false)
9
+ - literals (integer literals, True, False, etc.)
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from abc import abstractmethod
15
+ from typing import TYPE_CHECKING, Final, Generic, List, NamedTuple, Sequence, TypeVar, Union
16
+
17
+ from mypy_extensions import trait
18
+
19
+ from mypyc.ir.rtypes import (
20
+ RArray,
21
+ RInstance,
22
+ RTuple,
23
+ RType,
24
+ RVoid,
25
+ bit_rprimitive,
26
+ bool_rprimitive,
27
+ float_rprimitive,
28
+ int_rprimitive,
29
+ is_bit_rprimitive,
30
+ is_bool_rprimitive,
31
+ is_int_rprimitive,
32
+ is_none_rprimitive,
33
+ is_pointer_rprimitive,
34
+ is_short_int_rprimitive,
35
+ object_rprimitive,
36
+ pointer_rprimitive,
37
+ short_int_rprimitive,
38
+ void_rtype,
39
+ )
40
+
41
+ if TYPE_CHECKING:
42
+ from mypyc.codegen.literals import LiteralValue
43
+ from mypyc.ir.class_ir import ClassIR
44
+ from mypyc.ir.func_ir import FuncDecl, FuncIR
45
+
46
+ T = TypeVar("T")
47
+
48
+
49
+ class BasicBlock:
50
+ """IR basic block.
51
+
52
+ Contains a sequence of Ops and ends with a ControlOp (Goto,
53
+ Branch, Return or Unreachable). Only the last op can be a
54
+ ControlOp.
55
+
56
+ All generated Ops live in basic blocks. Basic blocks determine the
57
+ order of evaluation and control flow within a function. A basic
58
+ block is always associated with a single function/method (FuncIR).
59
+
60
+ When building the IR, ops that raise exceptions can be included in
61
+ the middle of a basic block, but the exceptions aren't checked.
62
+ Afterwards we perform a transform that inserts explicit checks for
63
+ all error conditions and splits basic blocks accordingly to preserve
64
+ the invariant that a jump, branch or return can only ever appear
65
+ as the final op in a block. Manually inserting error checking ops
66
+ would be boring and error-prone.
67
+
68
+ BasicBlocks have an error_handler attribute that determines where
69
+ to jump if an error occurs. If none is specified, an error will
70
+ propagate up out of the function. This is compiled away by the
71
+ `exceptions` module.
72
+
73
+ Block labels are used for pretty printing and emitting C code, and
74
+ get filled in by those passes.
75
+
76
+ Ops that may terminate the program aren't treated as exits.
77
+ """
78
+
79
+ def __init__(self, label: int = -1) -> None:
80
+ self.label = label
81
+ self.ops: list[Op] = []
82
+ self.error_handler: BasicBlock | None = None
83
+ self.referenced = False
84
+
85
+ @property
86
+ def terminated(self) -> bool:
87
+ """Does the block end with a jump, branch or return?
88
+
89
+ This should always be true after the basic block has been fully built, but
90
+ this is false during construction.
91
+ """
92
+ return bool(self.ops) and isinstance(self.ops[-1], ControlOp)
93
+
94
+ @property
95
+ def terminator(self) -> ControlOp:
96
+ """The terminator operation of the block."""
97
+ assert bool(self.ops) and isinstance(self.ops[-1], ControlOp)
98
+ return self.ops[-1]
99
+
100
+
101
+ # Never generates an exception
102
+ ERR_NEVER: Final = 0
103
+ # Generates magic value (c_error_value) based on target RType on exception
104
+ ERR_MAGIC: Final = 1
105
+ # Generates false (bool) on exception
106
+ ERR_FALSE: Final = 2
107
+ # Always fails
108
+ ERR_ALWAYS: Final = 3
109
+ # Like ERR_MAGIC, but the magic return overlaps with a possible return value, and
110
+ # an extra PyErr_Occurred() check is also required
111
+ ERR_MAGIC_OVERLAPPING: Final = 4
112
+
113
+ # Hack: using this line number for an op will suppress it in tracebacks
114
+ NO_TRACEBACK_LINE_NO = -10000
115
+
116
+
117
+ class Value:
118
+ """Abstract base class for all IR values.
119
+
120
+ These include references to registers, literals, and all
121
+ operations (Ops), such as assignments, calls and branches.
122
+
123
+ Values are often used as inputs of Ops. Register can be used as an
124
+ assignment target.
125
+
126
+ A Value is part of the IR being compiled if it's included in a BasicBlock
127
+ that is reachable from a FuncIR (i.e., is part of a function).
128
+
129
+ See also: Op is a subclass of Value that is the base class of all
130
+ operations.
131
+ """
132
+
133
+ # Source line number (-1 for no/unknown line)
134
+ line = -1
135
+ # Type of the value or the result of the operation
136
+ type: RType = void_rtype
137
+ is_borrowed = False
138
+
139
+ @property
140
+ def is_void(self) -> bool:
141
+ return isinstance(self.type, RVoid)
142
+
143
+
144
+ class Register(Value):
145
+ """A Register holds a value of a specific type, and it can be read and mutated.
146
+
147
+ A Register is always local to a function. Each local variable maps
148
+ to a Register, and they are also used for some (but not all)
149
+ temporary values.
150
+
151
+ Note that the term 'register' is overloaded and is sometimes used
152
+ to refer to arbitrary Values (for example, in RegisterOp).
153
+ """
154
+
155
+ def __init__(self, type: RType, name: str = "", is_arg: bool = False, line: int = -1) -> None:
156
+ self.type = type
157
+ self.name = name
158
+ self.is_arg = is_arg
159
+ self.is_borrowed = is_arg
160
+ self.line = line
161
+
162
+ @property
163
+ def is_void(self) -> bool:
164
+ return False
165
+
166
+ def __repr__(self) -> str:
167
+ return f"<Register {self.name!r} at {hex(id(self))}>"
168
+
169
+
170
+ class Integer(Value):
171
+ """Short integer literal.
172
+
173
+ Integer literals are treated as constant values and are generally
174
+ not included in data flow analyses and such, unlike Register and
175
+ Op subclasses.
176
+
177
+ Integer can represent multiple types:
178
+
179
+ * Short tagged integers (short_int_primitive type; the tag bit is clear)
180
+ * Ordinary fixed-width integers (e.g., int32_rprimitive)
181
+ * Values of other unboxed primitive types that are represented as integers
182
+ (none_rprimitive, bool_rprimitive)
183
+ * Null pointers (value 0) of various types, including object_rprimitive
184
+ """
185
+
186
+ def __init__(self, value: int, rtype: RType = short_int_rprimitive, line: int = -1) -> None:
187
+ if is_short_int_rprimitive(rtype) or is_int_rprimitive(rtype):
188
+ self.value = value * 2
189
+ else:
190
+ self.value = value
191
+ self.type = rtype
192
+ self.line = line
193
+
194
+ def numeric_value(self) -> int:
195
+ if is_short_int_rprimitive(self.type) or is_int_rprimitive(self.type):
196
+ return self.value // 2
197
+ return self.value
198
+
199
+
200
+ class Float(Value):
201
+ """Float literal.
202
+
203
+ Floating point literals are treated as constant values and are generally
204
+ not included in data flow analyses and such, unlike Register and
205
+ Op subclasses.
206
+ """
207
+
208
+ def __init__(self, value: float, line: int = -1) -> None:
209
+ self.value = value
210
+ self.type = float_rprimitive
211
+ self.line = line
212
+
213
+
214
+ class Op(Value):
215
+ """Abstract base class for all IR operations.
216
+
217
+ Each operation must be stored in a BasicBlock (in 'ops') to be
218
+ active in the IR. This is different from non-Op values, including
219
+ Register and Integer, where a reference from an active Op is
220
+ sufficient to be considered active.
221
+
222
+ In well-formed IR an active Op has no references to inactive ops
223
+ or ops used in another function.
224
+ """
225
+
226
+ def __init__(self, line: int) -> None:
227
+ self.line = line
228
+
229
+ def can_raise(self) -> bool:
230
+ # Override this is if Op may raise an exception. Note that currently the fact that
231
+ # only RegisterOps may raise an exception in hard coded in some places.
232
+ return False
233
+
234
+ @abstractmethod
235
+ def sources(self) -> list[Value]:
236
+ """All the values the op may read."""
237
+
238
+ def stolen(self) -> list[Value]:
239
+ """Return arguments that have a reference count stolen by this op"""
240
+ return []
241
+
242
+ def unique_sources(self) -> list[Value]:
243
+ result: list[Value] = []
244
+ for reg in self.sources():
245
+ if reg not in result:
246
+ result.append(reg)
247
+ return result
248
+
249
+ @abstractmethod
250
+ def accept(self, visitor: OpVisitor[T]) -> T:
251
+ pass
252
+
253
+
254
+ class BaseAssign(Op):
255
+ """Base class for ops that assign to a register."""
256
+
257
+ def __init__(self, dest: Register, line: int = -1) -> None:
258
+ super().__init__(line)
259
+ self.dest = dest
260
+
261
+
262
+ class Assign(BaseAssign):
263
+ """Assign a value to a Register (dest = src)."""
264
+
265
+ error_kind = ERR_NEVER
266
+
267
+ def __init__(self, dest: Register, src: Value, line: int = -1) -> None:
268
+ super().__init__(dest, line)
269
+ self.src = src
270
+
271
+ def sources(self) -> list[Value]:
272
+ return [self.src]
273
+
274
+ def stolen(self) -> list[Value]:
275
+ return [self.src]
276
+
277
+ def accept(self, visitor: OpVisitor[T]) -> T:
278
+ return visitor.visit_assign(self)
279
+
280
+
281
+ class AssignMulti(BaseAssign):
282
+ """Assign multiple values to a Register (dest = src1, src2, ...).
283
+
284
+ This is used to initialize RArray values. It's provided to avoid
285
+ very verbose IR for common vectorcall operations.
286
+
287
+ Note that this interacts atypically with reference counting. We
288
+ assume that each RArray register is initialized exactly once
289
+ with this op.
290
+ """
291
+
292
+ error_kind = ERR_NEVER
293
+
294
+ def __init__(self, dest: Register, src: list[Value], line: int = -1) -> None:
295
+ super().__init__(dest, line)
296
+ assert src
297
+ assert isinstance(dest.type, RArray)
298
+ assert dest.type.length == len(src)
299
+ self.src = src
300
+
301
+ def sources(self) -> list[Value]:
302
+ return self.src.copy()
303
+
304
+ def stolen(self) -> list[Value]:
305
+ return []
306
+
307
+ def accept(self, visitor: OpVisitor[T]) -> T:
308
+ return visitor.visit_assign_multi(self)
309
+
310
+
311
+ class ControlOp(Op):
312
+ """Control flow operation."""
313
+
314
+ def targets(self) -> Sequence[BasicBlock]:
315
+ """Get all basic block targets of the control operation."""
316
+ return ()
317
+
318
+ def set_target(self, i: int, new: BasicBlock) -> None:
319
+ """Update a basic block target."""
320
+ raise AssertionError(f"Invalid set_target({self}, {i})")
321
+
322
+
323
+ class Goto(ControlOp):
324
+ """Unconditional jump."""
325
+
326
+ error_kind = ERR_NEVER
327
+
328
+ def __init__(self, label: BasicBlock, line: int = -1) -> None:
329
+ super().__init__(line)
330
+ self.label = label
331
+
332
+ def targets(self) -> Sequence[BasicBlock]:
333
+ return (self.label,)
334
+
335
+ def set_target(self, i: int, new: BasicBlock) -> None:
336
+ assert i == 0
337
+ self.label = new
338
+
339
+ def __repr__(self) -> str:
340
+ return "<Goto %s>" % self.label.label
341
+
342
+ def sources(self) -> list[Value]:
343
+ return []
344
+
345
+ def accept(self, visitor: OpVisitor[T]) -> T:
346
+ return visitor.visit_goto(self)
347
+
348
+
349
+ class Branch(ControlOp):
350
+ """Branch based on a value.
351
+
352
+ If op is BOOL, branch based on a bit/bool value:
353
+ if [not] r1 goto L1 else goto L2
354
+
355
+ If op is IS_ERROR, branch based on whether there is an error value:
356
+ if [not] is_error(r1) goto L1 else goto L2
357
+ """
358
+
359
+ # Branch ops never raise an exception.
360
+ error_kind = ERR_NEVER
361
+
362
+ BOOL: Final = 100
363
+ IS_ERROR: Final = 101
364
+
365
+ def __init__(
366
+ self,
367
+ value: Value,
368
+ true_label: BasicBlock,
369
+ false_label: BasicBlock,
370
+ op: int,
371
+ line: int = -1,
372
+ *,
373
+ rare: bool = False,
374
+ ) -> None:
375
+ super().__init__(line)
376
+ # Target value being checked
377
+ self.value = value
378
+ # Branch here if the condition is true
379
+ self.true = true_label
380
+ # Branch here if the condition is false
381
+ self.false = false_label
382
+ # Branch.BOOL (boolean check) or Branch.IS_ERROR (error value check)
383
+ self.op = op
384
+ # If True, the condition is negated
385
+ self.negated = False
386
+ # If not None, the true label should generate a traceback entry (func name, line number)
387
+ self.traceback_entry: tuple[str, int] | None = None
388
+ # If True, we expect to usually take the false branch (for optimization purposes);
389
+ # this is implicitly treated as true if there is a traceback entry
390
+ self.rare = rare
391
+
392
+ def targets(self) -> Sequence[BasicBlock]:
393
+ return (self.true, self.false)
394
+
395
+ def set_target(self, i: int, new: BasicBlock) -> None:
396
+ assert i == 0 or i == 1
397
+ if i == 0:
398
+ self.true = new
399
+ else:
400
+ self.false = new
401
+
402
+ def sources(self) -> list[Value]:
403
+ return [self.value]
404
+
405
+ def invert(self) -> None:
406
+ self.negated = not self.negated
407
+
408
+ def accept(self, visitor: OpVisitor[T]) -> T:
409
+ return visitor.visit_branch(self)
410
+
411
+
412
+ class Return(ControlOp):
413
+ """Return a value from a function."""
414
+
415
+ error_kind = ERR_NEVER
416
+
417
+ def __init__(self, value: Value, line: int = -1) -> None:
418
+ super().__init__(line)
419
+ self.value = value
420
+
421
+ def sources(self) -> list[Value]:
422
+ return [self.value]
423
+
424
+ def stolen(self) -> list[Value]:
425
+ return [self.value]
426
+
427
+ def accept(self, visitor: OpVisitor[T]) -> T:
428
+ return visitor.visit_return(self)
429
+
430
+
431
+ class Unreachable(ControlOp):
432
+ """Mark the end of basic block as unreachable.
433
+
434
+ This is sometimes necessary when the end of a basic block is never
435
+ reached. This can also be explicitly added to the end of non-None
436
+ returning functions (in None-returning function we can just return
437
+ None).
438
+
439
+ Mypy statically guarantees that the end of the function is not
440
+ unreachable if there is not a return statement.
441
+
442
+ This prevents the block formatter from being confused due to lack
443
+ of a leave and also leaves a nifty note in the IR. It is not
444
+ generally processed by visitors.
445
+ """
446
+
447
+ error_kind = ERR_NEVER
448
+
449
+ def __init__(self, line: int = -1) -> None:
450
+ super().__init__(line)
451
+
452
+ def sources(self) -> list[Value]:
453
+ return []
454
+
455
+ def accept(self, visitor: OpVisitor[T]) -> T:
456
+ return visitor.visit_unreachable(self)
457
+
458
+
459
+ class RegisterOp(Op):
460
+ """Abstract base class for operations that can be written as r1 = f(r2, ..., rn).
461
+
462
+ Takes some values, performs an operation, and generates an output
463
+ (unless the 'type' attribute is void_rtype, which is the default).
464
+ Other ops can refer to the result of the Op by referring to the Op
465
+ instance. This doesn't do any explicit control flow, but can raise an
466
+ error.
467
+
468
+ Note that the operands can be arbitrary Values, not just Register
469
+ instances, even though the naming may suggest otherwise.
470
+ """
471
+
472
+ error_kind = -1 # Can this raise exception and how is it signalled; one of ERR_*
473
+
474
+ _type: RType | None = None
475
+
476
+ def __init__(self, line: int) -> None:
477
+ super().__init__(line)
478
+ assert self.error_kind != -1, "error_kind not defined"
479
+
480
+ def can_raise(self) -> bool:
481
+ return self.error_kind != ERR_NEVER
482
+
483
+
484
+ class IncRef(RegisterOp):
485
+ """Increase reference count (inc_ref src)."""
486
+
487
+ error_kind = ERR_NEVER
488
+
489
+ def __init__(self, src: Value, line: int = -1) -> None:
490
+ assert src.type.is_refcounted
491
+ super().__init__(line)
492
+ self.src = src
493
+
494
+ def sources(self) -> list[Value]:
495
+ return [self.src]
496
+
497
+ def accept(self, visitor: OpVisitor[T]) -> T:
498
+ return visitor.visit_inc_ref(self)
499
+
500
+
501
+ class DecRef(RegisterOp):
502
+ """Decrease reference count and free object if zero (dec_ref src).
503
+
504
+ The is_xdec flag says to use an XDECREF, which checks if the
505
+ pointer is NULL first.
506
+ """
507
+
508
+ error_kind = ERR_NEVER
509
+
510
+ def __init__(self, src: Value, is_xdec: bool = False, line: int = -1) -> None:
511
+ assert src.type.is_refcounted
512
+ super().__init__(line)
513
+ self.src = src
514
+ self.is_xdec = is_xdec
515
+
516
+ def __repr__(self) -> str:
517
+ return "<{}DecRef {!r}>".format("X" if self.is_xdec else "", self.src)
518
+
519
+ def sources(self) -> list[Value]:
520
+ return [self.src]
521
+
522
+ def accept(self, visitor: OpVisitor[T]) -> T:
523
+ return visitor.visit_dec_ref(self)
524
+
525
+
526
+ class Call(RegisterOp):
527
+ """Native call f(arg, ...).
528
+
529
+ The call target can be a module-level function or a class.
530
+ """
531
+
532
+ def __init__(self, fn: FuncDecl, args: Sequence[Value], line: int) -> None:
533
+ self.fn = fn
534
+ self.args = list(args)
535
+ assert len(self.args) == len(fn.sig.args)
536
+ self.type = fn.sig.ret_type
537
+ ret_type = fn.sig.ret_type
538
+ if not ret_type.error_overlap:
539
+ self.error_kind = ERR_MAGIC
540
+ else:
541
+ self.error_kind = ERR_MAGIC_OVERLAPPING
542
+ super().__init__(line)
543
+
544
+ def sources(self) -> list[Value]:
545
+ return list(self.args.copy())
546
+
547
+ def accept(self, visitor: OpVisitor[T]) -> T:
548
+ return visitor.visit_call(self)
549
+
550
+
551
+ class MethodCall(RegisterOp):
552
+ """Native method call obj.method(arg, ...)"""
553
+
554
+ def __init__(self, obj: Value, method: str, args: list[Value], line: int = -1) -> None:
555
+ self.obj = obj
556
+ self.method = method
557
+ self.args = args
558
+ assert isinstance(obj.type, RInstance), "Methods can only be called on instances"
559
+ self.receiver_type = obj.type
560
+ method_ir = self.receiver_type.class_ir.method_sig(method)
561
+ assert method_ir is not None, "{} doesn't have method {}".format(
562
+ self.receiver_type.name, method
563
+ )
564
+ ret_type = method_ir.ret_type
565
+ self.type = ret_type
566
+ if not ret_type.error_overlap:
567
+ self.error_kind = ERR_MAGIC
568
+ else:
569
+ self.error_kind = ERR_MAGIC_OVERLAPPING
570
+ super().__init__(line)
571
+
572
+ def sources(self) -> list[Value]:
573
+ return self.args.copy() + [self.obj]
574
+
575
+ def accept(self, visitor: OpVisitor[T]) -> T:
576
+ return visitor.visit_method_call(self)
577
+
578
+
579
+ class LoadErrorValue(RegisterOp):
580
+ """Load an error value.
581
+
582
+ Each type has one reserved value that signals an error (exception). This
583
+ loads the error value for a specific type.
584
+ """
585
+
586
+ error_kind = ERR_NEVER
587
+
588
+ def __init__(
589
+ self, rtype: RType, line: int = -1, is_borrowed: bool = False, undefines: bool = False
590
+ ) -> None:
591
+ super().__init__(line)
592
+ self.type = rtype
593
+ self.is_borrowed = is_borrowed
594
+ # Undefines is true if this should viewed by the definedness
595
+ # analysis pass as making the register it is assigned to
596
+ # undefined (and thus checks should be added on uses).
597
+ self.undefines = undefines
598
+
599
+ def sources(self) -> list[Value]:
600
+ return []
601
+
602
+ def accept(self, visitor: OpVisitor[T]) -> T:
603
+ return visitor.visit_load_error_value(self)
604
+
605
+
606
+ class LoadLiteral(RegisterOp):
607
+ """Load a Python literal object (dest = 'foo' / b'foo' / ...).
608
+
609
+ This is used to load a static PyObject * value corresponding to
610
+ a literal of one of the supported types.
611
+
612
+ Tuple / frozenset literals must contain only valid literal values as items.
613
+
614
+ NOTE: You can use this to load boxed (Python) int objects. Use
615
+ Integer to load unboxed, tagged integers or fixed-width,
616
+ low-level integers.
617
+
618
+ For int literals, both int_rprimitive (CPyTagged) and
619
+ object_primitive (PyObject *) are supported as rtype. However,
620
+ when using int_rprimitive, the value must *not* be small enough
621
+ to fit in an unboxed integer.
622
+ """
623
+
624
+ error_kind = ERR_NEVER
625
+ is_borrowed = True
626
+
627
+ def __init__(self, value: LiteralValue, rtype: RType) -> None:
628
+ self.value = value
629
+ self.type = rtype
630
+
631
+ def sources(self) -> list[Value]:
632
+ return []
633
+
634
+ def accept(self, visitor: OpVisitor[T]) -> T:
635
+ return visitor.visit_load_literal(self)
636
+
637
+
638
+ class GetAttr(RegisterOp):
639
+ """obj.attr (for a native object)"""
640
+
641
+ error_kind = ERR_MAGIC
642
+
643
+ def __init__(self, obj: Value, attr: str, line: int, *, borrow: bool = False) -> None:
644
+ super().__init__(line)
645
+ self.obj = obj
646
+ self.attr = attr
647
+ assert isinstance(obj.type, RInstance), "Attribute access not supported: %s" % obj.type
648
+ self.class_type = obj.type
649
+ attr_type = obj.type.attr_type(attr)
650
+ self.type = attr_type
651
+ if attr_type.error_overlap:
652
+ self.error_kind = ERR_MAGIC_OVERLAPPING
653
+ self.is_borrowed = borrow and attr_type.is_refcounted
654
+
655
+ def sources(self) -> list[Value]:
656
+ return [self.obj]
657
+
658
+ def accept(self, visitor: OpVisitor[T]) -> T:
659
+ return visitor.visit_get_attr(self)
660
+
661
+
662
+ class SetAttr(RegisterOp):
663
+ """obj.attr = src (for a native object)
664
+
665
+ Steals the reference to src.
666
+ """
667
+
668
+ error_kind = ERR_FALSE
669
+
670
+ def __init__(self, obj: Value, attr: str, src: Value, line: int) -> None:
671
+ super().__init__(line)
672
+ self.obj = obj
673
+ self.attr = attr
674
+ self.src = src
675
+ assert isinstance(obj.type, RInstance), "Attribute access not supported: %s" % obj.type
676
+ self.class_type = obj.type
677
+ self.type = bool_rprimitive
678
+ # If True, we can safely assume that the attribute is previously undefined
679
+ # and we don't use a setter
680
+ self.is_init = False
681
+
682
+ def mark_as_initializer(self) -> None:
683
+ self.is_init = True
684
+ self.error_kind = ERR_NEVER
685
+ self.type = void_rtype
686
+
687
+ def sources(self) -> list[Value]:
688
+ return [self.obj, self.src]
689
+
690
+ def stolen(self) -> list[Value]:
691
+ return [self.src]
692
+
693
+ def accept(self, visitor: OpVisitor[T]) -> T:
694
+ return visitor.visit_set_attr(self)
695
+
696
+
697
+ # Default name space for statics, variables
698
+ NAMESPACE_STATIC: Final = "static"
699
+
700
+ # Static namespace for pointers to native type objects
701
+ NAMESPACE_TYPE: Final = "type"
702
+
703
+ # Namespace for modules
704
+ NAMESPACE_MODULE: Final = "module"
705
+
706
+
707
+ class LoadStatic(RegisterOp):
708
+ """Load a static name (name :: static).
709
+
710
+ Load a C static variable/pointer. The namespace for statics is shared
711
+ for the entire compilation group. You can optionally provide a module
712
+ name and a sub-namespace identifier for additional namespacing to avoid
713
+ name conflicts. The static namespace does not overlap with other C names,
714
+ since the final C name will get a prefix, so conflicts only must be
715
+ avoided with other statics.
716
+ """
717
+
718
+ error_kind = ERR_NEVER
719
+ is_borrowed = True
720
+
721
+ def __init__(
722
+ self,
723
+ type: RType,
724
+ identifier: str,
725
+ module_name: str | None = None,
726
+ namespace: str = NAMESPACE_STATIC,
727
+ line: int = -1,
728
+ ann: object = None,
729
+ ) -> None:
730
+ super().__init__(line)
731
+ self.identifier = identifier
732
+ self.module_name = module_name
733
+ self.namespace = namespace
734
+ self.type = type
735
+ self.ann = ann # An object to pretty print with the load
736
+
737
+ def sources(self) -> list[Value]:
738
+ return []
739
+
740
+ def accept(self, visitor: OpVisitor[T]) -> T:
741
+ return visitor.visit_load_static(self)
742
+
743
+
744
+ class InitStatic(RegisterOp):
745
+ """static = value :: static
746
+
747
+ Initialize a C static variable/pointer. See everything in LoadStatic.
748
+ """
749
+
750
+ error_kind = ERR_NEVER
751
+
752
+ def __init__(
753
+ self,
754
+ value: Value,
755
+ identifier: str,
756
+ module_name: str | None = None,
757
+ namespace: str = NAMESPACE_STATIC,
758
+ line: int = -1,
759
+ ) -> None:
760
+ super().__init__(line)
761
+ self.identifier = identifier
762
+ self.module_name = module_name
763
+ self.namespace = namespace
764
+ self.value = value
765
+
766
+ def sources(self) -> list[Value]:
767
+ return [self.value]
768
+
769
+ def accept(self, visitor: OpVisitor[T]) -> T:
770
+ return visitor.visit_init_static(self)
771
+
772
+
773
+ class TupleSet(RegisterOp):
774
+ """dest = (reg, ...) (for fixed-length tuple)"""
775
+
776
+ error_kind = ERR_NEVER
777
+
778
+ def __init__(self, items: list[Value], line: int) -> None:
779
+ super().__init__(line)
780
+ self.items = items
781
+ # Don't keep track of the fact that an int is short after it
782
+ # is put into a tuple, since we don't properly implement
783
+ # runtime subtyping for tuples.
784
+ self.tuple_type = RTuple(
785
+ [
786
+ arg.type if not is_short_int_rprimitive(arg.type) else int_rprimitive
787
+ for arg in items
788
+ ]
789
+ )
790
+ self.type = self.tuple_type
791
+
792
+ def sources(self) -> list[Value]:
793
+ return self.items.copy()
794
+
795
+ def stolen(self) -> list[Value]:
796
+ return self.items.copy()
797
+
798
+ def accept(self, visitor: OpVisitor[T]) -> T:
799
+ return visitor.visit_tuple_set(self)
800
+
801
+
802
+ class TupleGet(RegisterOp):
803
+ """Get item of a fixed-length tuple (src[index])."""
804
+
805
+ error_kind = ERR_NEVER
806
+
807
+ def __init__(self, src: Value, index: int, line: int = -1, *, borrow: bool = False) -> None:
808
+ super().__init__(line)
809
+ self.src = src
810
+ self.index = index
811
+ assert isinstance(src.type, RTuple), "TupleGet only operates on tuples"
812
+ assert index >= 0
813
+ self.type = src.type.types[index]
814
+ self.is_borrowed = borrow
815
+
816
+ def sources(self) -> list[Value]:
817
+ return [self.src]
818
+
819
+ def accept(self, visitor: OpVisitor[T]) -> T:
820
+ return visitor.visit_tuple_get(self)
821
+
822
+
823
+ class Cast(RegisterOp):
824
+ """cast(type, src)
825
+
826
+ Perform a runtime type check (no representation or value conversion).
827
+
828
+ DO NOT increment reference counts.
829
+ """
830
+
831
+ error_kind = ERR_MAGIC
832
+
833
+ def __init__(self, src: Value, typ: RType, line: int, *, borrow: bool = False) -> None:
834
+ super().__init__(line)
835
+ self.src = src
836
+ self.type = typ
837
+ self.is_borrowed = borrow
838
+
839
+ def sources(self) -> list[Value]:
840
+ return [self.src]
841
+
842
+ def stolen(self) -> list[Value]:
843
+ if self.is_borrowed:
844
+ return []
845
+ return [self.src]
846
+
847
+ def accept(self, visitor: OpVisitor[T]) -> T:
848
+ return visitor.visit_cast(self)
849
+
850
+
851
+ class Box(RegisterOp):
852
+ """box(type, src)
853
+
854
+ This converts from a potentially unboxed representation to a straight Python object.
855
+ Only supported for types with an unboxed representation.
856
+ """
857
+
858
+ error_kind = ERR_NEVER
859
+
860
+ def __init__(self, src: Value, line: int = -1) -> None:
861
+ super().__init__(line)
862
+ self.src = src
863
+ self.type = object_rprimitive
864
+ # When we box None and bool values, we produce a borrowed result
865
+ if (
866
+ is_none_rprimitive(self.src.type)
867
+ or is_bool_rprimitive(self.src.type)
868
+ or is_bit_rprimitive(self.src.type)
869
+ ):
870
+ self.is_borrowed = True
871
+
872
+ def sources(self) -> list[Value]:
873
+ return [self.src]
874
+
875
+ def stolen(self) -> list[Value]:
876
+ return [self.src]
877
+
878
+ def accept(self, visitor: OpVisitor[T]) -> T:
879
+ return visitor.visit_box(self)
880
+
881
+
882
+ class Unbox(RegisterOp):
883
+ """unbox(type, src)
884
+
885
+ This is similar to a cast, but it also changes to a (potentially) unboxed runtime
886
+ representation. Only supported for types with an unboxed representation.
887
+ """
888
+
889
+ def __init__(self, src: Value, typ: RType, line: int) -> None:
890
+ self.src = src
891
+ self.type = typ
892
+ if not typ.error_overlap:
893
+ self.error_kind = ERR_MAGIC
894
+ else:
895
+ self.error_kind = ERR_MAGIC_OVERLAPPING
896
+ super().__init__(line)
897
+
898
+ def sources(self) -> list[Value]:
899
+ return [self.src]
900
+
901
+ def accept(self, visitor: OpVisitor[T]) -> T:
902
+ return visitor.visit_unbox(self)
903
+
904
+
905
+ class RaiseStandardError(RegisterOp):
906
+ """Raise built-in exception with an optional error string.
907
+
908
+ We have a separate opcode for this for convenience and to
909
+ generate smaller, more idiomatic C code.
910
+ """
911
+
912
+ # TODO: Make it more explicit at IR level that this always raises
913
+
914
+ error_kind = ERR_FALSE
915
+
916
+ VALUE_ERROR: Final = "ValueError"
917
+ ASSERTION_ERROR: Final = "AssertionError"
918
+ STOP_ITERATION: Final = "StopIteration"
919
+ UNBOUND_LOCAL_ERROR: Final = "UnboundLocalError"
920
+ RUNTIME_ERROR: Final = "RuntimeError"
921
+ NAME_ERROR: Final = "NameError"
922
+ ZERO_DIVISION_ERROR: Final = "ZeroDivisionError"
923
+
924
+ def __init__(self, class_name: str, value: str | Value | None, line: int) -> None:
925
+ super().__init__(line)
926
+ self.class_name = class_name
927
+ self.value = value
928
+ self.type = bool_rprimitive
929
+
930
+ def sources(self) -> list[Value]:
931
+ return []
932
+
933
+ def accept(self, visitor: OpVisitor[T]) -> T:
934
+ return visitor.visit_raise_standard_error(self)
935
+
936
+
937
+ # True steals all arguments, False steals none, a list steals those in matching positions
938
+ StealsDescription = Union[bool, List[bool]]
939
+
940
+
941
+ class CallC(RegisterOp):
942
+ """result = function(arg0, arg1, ...)
943
+
944
+ Call a C function that is not a compiled/native function (for
945
+ example, a Python C API function). Use Call to call native
946
+ functions.
947
+ """
948
+
949
+ def __init__(
950
+ self,
951
+ function_name: str,
952
+ args: list[Value],
953
+ ret_type: RType,
954
+ steals: StealsDescription,
955
+ is_borrowed: bool,
956
+ error_kind: int,
957
+ line: int,
958
+ var_arg_idx: int = -1,
959
+ ) -> None:
960
+ self.error_kind = error_kind
961
+ super().__init__(line)
962
+ self.function_name = function_name
963
+ self.args = args
964
+ self.type = ret_type
965
+ self.steals = steals
966
+ self.is_borrowed = is_borrowed
967
+ # The position of the first variable argument in args (if >= 0)
968
+ self.var_arg_idx = var_arg_idx
969
+
970
+ def sources(self) -> list[Value]:
971
+ return self.args
972
+
973
+ def stolen(self) -> list[Value]:
974
+ if isinstance(self.steals, list):
975
+ assert len(self.steals) == len(self.args)
976
+ return [arg for arg, steal in zip(self.args, self.steals) if steal]
977
+ else:
978
+ return [] if not self.steals else self.sources()
979
+
980
+ def accept(self, visitor: OpVisitor[T]) -> T:
981
+ return visitor.visit_call_c(self)
982
+
983
+
984
+ class Truncate(RegisterOp):
985
+ """result = truncate src from src_type to dst_type
986
+
987
+ Truncate a value from type with more bits to type with less bits.
988
+
989
+ dst_type and src_type can be native integer types, bools or tagged
990
+ integers. Tagged integers should have the tag bit unset.
991
+ """
992
+
993
+ error_kind = ERR_NEVER
994
+
995
+ def __init__(self, src: Value, dst_type: RType, line: int = -1) -> None:
996
+ super().__init__(line)
997
+ self.src = src
998
+ self.type = dst_type
999
+ self.src_type = src.type
1000
+
1001
+ def sources(self) -> list[Value]:
1002
+ return [self.src]
1003
+
1004
+ def stolen(self) -> list[Value]:
1005
+ return []
1006
+
1007
+ def accept(self, visitor: OpVisitor[T]) -> T:
1008
+ return visitor.visit_truncate(self)
1009
+
1010
+
1011
+ class Extend(RegisterOp):
1012
+ """result = extend src from src_type to dst_type
1013
+
1014
+ Extend a value from a type with fewer bits to a type with more bits.
1015
+
1016
+ dst_type and src_type can be native integer types, bools or tagged
1017
+ integers. Tagged integers should have the tag bit unset.
1018
+
1019
+ If 'signed' is true, perform sign extension. Otherwise, the result will be
1020
+ zero extended.
1021
+ """
1022
+
1023
+ error_kind = ERR_NEVER
1024
+
1025
+ def __init__(self, src: Value, dst_type: RType, signed: bool, line: int = -1) -> None:
1026
+ super().__init__(line)
1027
+ self.src = src
1028
+ self.type = dst_type
1029
+ self.src_type = src.type
1030
+ self.signed = signed
1031
+
1032
+ def sources(self) -> list[Value]:
1033
+ return [self.src]
1034
+
1035
+ def stolen(self) -> list[Value]:
1036
+ return []
1037
+
1038
+ def accept(self, visitor: OpVisitor[T]) -> T:
1039
+ return visitor.visit_extend(self)
1040
+
1041
+
1042
+ class LoadGlobal(RegisterOp):
1043
+ """Load a low-level global variable/pointer.
1044
+
1045
+ Note that can't be used to directly load Python module-level
1046
+ global variable, since they are stored in a globals dictionary
1047
+ and accessed using dictionary operations.
1048
+ """
1049
+
1050
+ error_kind = ERR_NEVER
1051
+ is_borrowed = True
1052
+
1053
+ def __init__(self, type: RType, identifier: str, line: int = -1, ann: object = None) -> None:
1054
+ super().__init__(line)
1055
+ self.identifier = identifier
1056
+ self.type = type
1057
+ self.ann = ann # An object to pretty print with the load
1058
+
1059
+ def sources(self) -> list[Value]:
1060
+ return []
1061
+
1062
+ def accept(self, visitor: OpVisitor[T]) -> T:
1063
+ return visitor.visit_load_global(self)
1064
+
1065
+
1066
+ class IntOp(RegisterOp):
1067
+ """Binary arithmetic or bitwise op on integer operands (e.g., r1 = r2 + r3).
1068
+
1069
+ These ops are low-level and are similar to the corresponding C
1070
+ operations.
1071
+
1072
+ The left and right values must have low-level integer types with
1073
+ compatible representations. Fixed-width integers, short_int_rprimitive,
1074
+ bool_rprimitive and bit_rprimitive are supported.
1075
+
1076
+ For tagged (arbitrary-precision) integer ops look at mypyc.primitives.int_ops.
1077
+ """
1078
+
1079
+ error_kind = ERR_NEVER
1080
+
1081
+ # Arithmetic ops
1082
+ ADD: Final = 0
1083
+ SUB: Final = 1
1084
+ MUL: Final = 2
1085
+ DIV: Final = 3
1086
+ MOD: Final = 4
1087
+
1088
+ # Bitwise ops
1089
+ AND: Final = 200
1090
+ OR: Final = 201
1091
+ XOR: Final = 202
1092
+ LEFT_SHIFT: Final = 203
1093
+ RIGHT_SHIFT: Final = 204
1094
+
1095
+ op_str: Final = {
1096
+ ADD: "+",
1097
+ SUB: "-",
1098
+ MUL: "*",
1099
+ DIV: "/",
1100
+ MOD: "%",
1101
+ AND: "&",
1102
+ OR: "|",
1103
+ XOR: "^",
1104
+ LEFT_SHIFT: "<<",
1105
+ RIGHT_SHIFT: ">>",
1106
+ }
1107
+
1108
+ def __init__(self, type: RType, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
1109
+ super().__init__(line)
1110
+ self.type = type
1111
+ self.lhs = lhs
1112
+ self.rhs = rhs
1113
+ self.op = op
1114
+
1115
+ def sources(self) -> list[Value]:
1116
+ return [self.lhs, self.rhs]
1117
+
1118
+ def accept(self, visitor: OpVisitor[T]) -> T:
1119
+ return visitor.visit_int_op(self)
1120
+
1121
+
1122
+ # We can't have this in the IntOp class body, because of
1123
+ # https://github.com/mypyc/mypyc/issues/932.
1124
+ int_op_to_id: Final = {op: op_id for op_id, op in IntOp.op_str.items()}
1125
+
1126
+
1127
+ class ComparisonOp(RegisterOp):
1128
+ """Low-level comparison op for integers and pointers.
1129
+
1130
+ Both unsigned and signed comparisons are supported. Supports
1131
+ comparisons between fixed-width integer types and pointer types.
1132
+ The operands should have matching sizes.
1133
+
1134
+ The result is always a bit (representing a boolean).
1135
+
1136
+ Python semantics, such as calling __eq__, are not supported.
1137
+ """
1138
+
1139
+ # Must be ERR_NEVER or ERR_FALSE. ERR_FALSE means that a false result
1140
+ # indicates that an exception has been raised and should be propagated.
1141
+ error_kind = ERR_NEVER
1142
+
1143
+ # S for signed and U for unsigned
1144
+ EQ: Final = 100
1145
+ NEQ: Final = 101
1146
+ SLT: Final = 102
1147
+ SGT: Final = 103
1148
+ SLE: Final = 104
1149
+ SGE: Final = 105
1150
+ ULT: Final = 106
1151
+ UGT: Final = 107
1152
+ ULE: Final = 108
1153
+ UGE: Final = 109
1154
+
1155
+ op_str: Final = {
1156
+ EQ: "==",
1157
+ NEQ: "!=",
1158
+ SLT: "<",
1159
+ SGT: ">",
1160
+ SLE: "<=",
1161
+ SGE: ">=",
1162
+ ULT: "<",
1163
+ UGT: ">",
1164
+ ULE: "<=",
1165
+ UGE: ">=",
1166
+ }
1167
+
1168
+ signed_ops: Final = {"==": EQ, "!=": NEQ, "<": SLT, ">": SGT, "<=": SLE, ">=": SGE}
1169
+ unsigned_ops: Final = {"==": EQ, "!=": NEQ, "<": ULT, ">": UGT, "<=": ULE, ">=": UGE}
1170
+
1171
+ def __init__(self, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
1172
+ super().__init__(line)
1173
+ self.type = bit_rprimitive
1174
+ self.lhs = lhs
1175
+ self.rhs = rhs
1176
+ self.op = op
1177
+
1178
+ def sources(self) -> list[Value]:
1179
+ return [self.lhs, self.rhs]
1180
+
1181
+ def accept(self, visitor: OpVisitor[T]) -> T:
1182
+ return visitor.visit_comparison_op(self)
1183
+
1184
+
1185
+ class FloatOp(RegisterOp):
1186
+ """Binary float arithmetic op (e.g., r1 = r2 + r3).
1187
+
1188
+ These ops are low-level and are similar to the corresponding C
1189
+ operations (and somewhat different from Python operations).
1190
+
1191
+ The left and right values must be floats.
1192
+ """
1193
+
1194
+ error_kind = ERR_NEVER
1195
+
1196
+ ADD: Final = 0
1197
+ SUB: Final = 1
1198
+ MUL: Final = 2
1199
+ DIV: Final = 3
1200
+ MOD: Final = 4
1201
+
1202
+ op_str: Final = {ADD: "+", SUB: "-", MUL: "*", DIV: "/", MOD: "%"}
1203
+
1204
+ def __init__(self, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
1205
+ super().__init__(line)
1206
+ self.type = float_rprimitive
1207
+ self.lhs = lhs
1208
+ self.rhs = rhs
1209
+ self.op = op
1210
+
1211
+ def sources(self) -> list[Value]:
1212
+ return [self.lhs, self.rhs]
1213
+
1214
+ def accept(self, visitor: OpVisitor[T]) -> T:
1215
+ return visitor.visit_float_op(self)
1216
+
1217
+
1218
+ # We can't have this in the FloatOp class body, because of
1219
+ # https://github.com/mypyc/mypyc/issues/932.
1220
+ float_op_to_id: Final = {op: op_id for op_id, op in FloatOp.op_str.items()}
1221
+
1222
+
1223
+ class FloatNeg(RegisterOp):
1224
+ """Float negation op (r1 = -r2)."""
1225
+
1226
+ error_kind = ERR_NEVER
1227
+
1228
+ def __init__(self, src: Value, line: int = -1) -> None:
1229
+ super().__init__(line)
1230
+ self.type = float_rprimitive
1231
+ self.src = src
1232
+
1233
+ def sources(self) -> list[Value]:
1234
+ return [self.src]
1235
+
1236
+ def accept(self, visitor: OpVisitor[T]) -> T:
1237
+ return visitor.visit_float_neg(self)
1238
+
1239
+
1240
+ class FloatComparisonOp(RegisterOp):
1241
+ """Low-level comparison op for floats."""
1242
+
1243
+ error_kind = ERR_NEVER
1244
+
1245
+ EQ: Final = 200
1246
+ NEQ: Final = 201
1247
+ LT: Final = 202
1248
+ GT: Final = 203
1249
+ LE: Final = 204
1250
+ GE: Final = 205
1251
+
1252
+ op_str: Final = {EQ: "==", NEQ: "!=", LT: "<", GT: ">", LE: "<=", GE: ">="}
1253
+
1254
+ def __init__(self, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
1255
+ super().__init__(line)
1256
+ self.type = bit_rprimitive
1257
+ self.lhs = lhs
1258
+ self.rhs = rhs
1259
+ self.op = op
1260
+
1261
+ def sources(self) -> list[Value]:
1262
+ return [self.lhs, self.rhs]
1263
+
1264
+ def accept(self, visitor: OpVisitor[T]) -> T:
1265
+ return visitor.visit_float_comparison_op(self)
1266
+
1267
+
1268
+ # We can't have this in the FloatOp class body, because of
1269
+ # https://github.com/mypyc/mypyc/issues/932.
1270
+ float_comparison_op_to_id: Final = {op: op_id for op_id, op in FloatComparisonOp.op_str.items()}
1271
+
1272
+
1273
+ class LoadMem(RegisterOp):
1274
+ """Read a memory location: result = *(type *)src.
1275
+
1276
+ Attributes:
1277
+ type: Type of the read value
1278
+ src: Pointer to memory to read
1279
+ """
1280
+
1281
+ error_kind = ERR_NEVER
1282
+
1283
+ def __init__(self, type: RType, src: Value, line: int = -1) -> None:
1284
+ super().__init__(line)
1285
+ self.type = type
1286
+ # TODO: for now we enforce that the src memory address should be Py_ssize_t
1287
+ # later we should also support same width unsigned int
1288
+ assert is_pointer_rprimitive(src.type)
1289
+ self.src = src
1290
+ self.is_borrowed = True
1291
+
1292
+ def sources(self) -> list[Value]:
1293
+ return [self.src]
1294
+
1295
+ def accept(self, visitor: OpVisitor[T]) -> T:
1296
+ return visitor.visit_load_mem(self)
1297
+
1298
+
1299
+ class SetMem(Op):
1300
+ """Write to a memory location: *(type *)dest = src
1301
+
1302
+ Attributes:
1303
+ type: Type of the written value
1304
+ dest: Pointer to memory to write
1305
+ src: Source value
1306
+ """
1307
+
1308
+ error_kind = ERR_NEVER
1309
+
1310
+ def __init__(self, type: RType, dest: Value, src: Value, line: int = -1) -> None:
1311
+ super().__init__(line)
1312
+ self.type = void_rtype
1313
+ self.dest_type = type
1314
+ self.src = src
1315
+ self.dest = dest
1316
+
1317
+ def sources(self) -> list[Value]:
1318
+ return [self.src, self.dest]
1319
+
1320
+ def stolen(self) -> list[Value]:
1321
+ return [self.src]
1322
+
1323
+ def accept(self, visitor: OpVisitor[T]) -> T:
1324
+ return visitor.visit_set_mem(self)
1325
+
1326
+
1327
+ class GetElementPtr(RegisterOp):
1328
+ """Get the address of a struct element.
1329
+
1330
+ Note that you may need to use KeepAlive to avoid the struct
1331
+ being freed, if it's reference counted, such as PyObject *.
1332
+ """
1333
+
1334
+ error_kind = ERR_NEVER
1335
+
1336
+ def __init__(self, src: Value, src_type: RType, field: str, line: int = -1) -> None:
1337
+ super().__init__(line)
1338
+ self.type = pointer_rprimitive
1339
+ self.src = src
1340
+ self.src_type = src_type
1341
+ self.field = field
1342
+
1343
+ def sources(self) -> list[Value]:
1344
+ return [self.src]
1345
+
1346
+ def accept(self, visitor: OpVisitor[T]) -> T:
1347
+ return visitor.visit_get_element_ptr(self)
1348
+
1349
+
1350
+ class LoadAddress(RegisterOp):
1351
+ """Get the address of a value: result = (type)&src
1352
+
1353
+ Attributes:
1354
+ type: Type of the loaded address(e.g. ptr/object_ptr)
1355
+ src: Source value (str for globals like 'PyList_Type',
1356
+ Register for temporary values or locals, LoadStatic
1357
+ for statics.)
1358
+ """
1359
+
1360
+ error_kind = ERR_NEVER
1361
+ is_borrowed = True
1362
+
1363
+ def __init__(self, type: RType, src: str | Register | LoadStatic, line: int = -1) -> None:
1364
+ super().__init__(line)
1365
+ self.type = type
1366
+ self.src = src
1367
+
1368
+ def sources(self) -> list[Value]:
1369
+ if isinstance(self.src, Register):
1370
+ return [self.src]
1371
+ else:
1372
+ return []
1373
+
1374
+ def accept(self, visitor: OpVisitor[T]) -> T:
1375
+ return visitor.visit_load_address(self)
1376
+
1377
+
1378
+ class KeepAlive(RegisterOp):
1379
+ """A no-op operation that ensures source values aren't freed.
1380
+
1381
+ This is sometimes useful to avoid decref when a reference is still
1382
+ being held but not seen by the compiler.
1383
+
1384
+ A typical use case is like this (C-like pseudocode):
1385
+
1386
+ ptr = &x.item
1387
+ r = *ptr
1388
+ keep_alive x # x must not be freed here
1389
+ # x may be freed here
1390
+
1391
+ If we didn't have "keep_alive x", x could be freed immediately
1392
+ after taking the address of 'item', resulting in a read after free
1393
+ on the second line.
1394
+
1395
+ If 'steal' is true, the value is considered to be stolen at
1396
+ this op, i.e. it won't be decref'd. You need to ensure that
1397
+ the value is freed otherwise, perhaps by using borrowing
1398
+ followed by Unborrow.
1399
+
1400
+ Be careful with steal=True -- this can cause memory leaks.
1401
+ """
1402
+
1403
+ error_kind = ERR_NEVER
1404
+
1405
+ def __init__(self, src: list[Value], *, steal: bool = False) -> None:
1406
+ assert src
1407
+ self.src = src
1408
+ self.steal = steal
1409
+
1410
+ def sources(self) -> list[Value]:
1411
+ return self.src.copy()
1412
+
1413
+ def stolen(self) -> list[Value]:
1414
+ if self.steal:
1415
+ return self.src.copy()
1416
+ return []
1417
+
1418
+ def accept(self, visitor: OpVisitor[T]) -> T:
1419
+ return visitor.visit_keep_alive(self)
1420
+
1421
+
1422
+ class Unborrow(RegisterOp):
1423
+ """A no-op op to create a regular reference from a borrowed one.
1424
+
1425
+ Borrowed references can only be used temporarily and the reference
1426
+ counts won't be managed. This value will be refcounted normally.
1427
+
1428
+ This is mainly useful if you split an aggregate value, such as
1429
+ a tuple, into components using borrowed values (to avoid increfs),
1430
+ and want to treat the components as sharing the original managed
1431
+ reference. You'll also need to use KeepAlive with steal=True to
1432
+ "consume" the original tuple reference:
1433
+
1434
+ # t is a 2-tuple
1435
+ r0 = borrow t[0]
1436
+ r1 = borrow t[1]
1437
+ r2 = unborrow r0
1438
+ r3 = unborrow r1
1439
+ # now (r2, r3) represent the tuple as separate items, and the
1440
+ # original tuple can be considered dead and available to be
1441
+ # stolen
1442
+ keep_alive steal t
1443
+
1444
+ Be careful with this -- this can easily cause double freeing.
1445
+ """
1446
+
1447
+ error_kind = ERR_NEVER
1448
+
1449
+ def __init__(self, src: Value) -> None:
1450
+ assert src.is_borrowed
1451
+ self.src = src
1452
+ self.type = src.type
1453
+
1454
+ def sources(self) -> list[Value]:
1455
+ return [self.src]
1456
+
1457
+ def stolen(self) -> list[Value]:
1458
+ return []
1459
+
1460
+ def accept(self, visitor: OpVisitor[T]) -> T:
1461
+ return visitor.visit_unborrow(self)
1462
+
1463
+
1464
+ @trait
1465
+ class OpVisitor(Generic[T]):
1466
+ """Generic visitor over ops (uses the visitor design pattern)."""
1467
+
1468
+ @abstractmethod
1469
+ def visit_goto(self, op: Goto) -> T:
1470
+ raise NotImplementedError
1471
+
1472
+ @abstractmethod
1473
+ def visit_branch(self, op: Branch) -> T:
1474
+ raise NotImplementedError
1475
+
1476
+ @abstractmethod
1477
+ def visit_return(self, op: Return) -> T:
1478
+ raise NotImplementedError
1479
+
1480
+ @abstractmethod
1481
+ def visit_unreachable(self, op: Unreachable) -> T:
1482
+ raise NotImplementedError
1483
+
1484
+ @abstractmethod
1485
+ def visit_assign(self, op: Assign) -> T:
1486
+ raise NotImplementedError
1487
+
1488
+ @abstractmethod
1489
+ def visit_assign_multi(self, op: AssignMulti) -> T:
1490
+ raise NotImplementedError
1491
+
1492
+ @abstractmethod
1493
+ def visit_load_error_value(self, op: LoadErrorValue) -> T:
1494
+ raise NotImplementedError
1495
+
1496
+ @abstractmethod
1497
+ def visit_load_literal(self, op: LoadLiteral) -> T:
1498
+ raise NotImplementedError
1499
+
1500
+ @abstractmethod
1501
+ def visit_get_attr(self, op: GetAttr) -> T:
1502
+ raise NotImplementedError
1503
+
1504
+ @abstractmethod
1505
+ def visit_set_attr(self, op: SetAttr) -> T:
1506
+ raise NotImplementedError
1507
+
1508
+ @abstractmethod
1509
+ def visit_load_static(self, op: LoadStatic) -> T:
1510
+ raise NotImplementedError
1511
+
1512
+ @abstractmethod
1513
+ def visit_init_static(self, op: InitStatic) -> T:
1514
+ raise NotImplementedError
1515
+
1516
+ @abstractmethod
1517
+ def visit_tuple_get(self, op: TupleGet) -> T:
1518
+ raise NotImplementedError
1519
+
1520
+ @abstractmethod
1521
+ def visit_tuple_set(self, op: TupleSet) -> T:
1522
+ raise NotImplementedError
1523
+
1524
+ def visit_inc_ref(self, op: IncRef) -> T:
1525
+ raise NotImplementedError
1526
+
1527
+ def visit_dec_ref(self, op: DecRef) -> T:
1528
+ raise NotImplementedError
1529
+
1530
+ @abstractmethod
1531
+ def visit_call(self, op: Call) -> T:
1532
+ raise NotImplementedError
1533
+
1534
+ @abstractmethod
1535
+ def visit_method_call(self, op: MethodCall) -> T:
1536
+ raise NotImplementedError
1537
+
1538
+ @abstractmethod
1539
+ def visit_cast(self, op: Cast) -> T:
1540
+ raise NotImplementedError
1541
+
1542
+ @abstractmethod
1543
+ def visit_box(self, op: Box) -> T:
1544
+ raise NotImplementedError
1545
+
1546
+ @abstractmethod
1547
+ def visit_unbox(self, op: Unbox) -> T:
1548
+ raise NotImplementedError
1549
+
1550
+ @abstractmethod
1551
+ def visit_raise_standard_error(self, op: RaiseStandardError) -> T:
1552
+ raise NotImplementedError
1553
+
1554
+ @abstractmethod
1555
+ def visit_call_c(self, op: CallC) -> T:
1556
+ raise NotImplementedError
1557
+
1558
+ @abstractmethod
1559
+ def visit_truncate(self, op: Truncate) -> T:
1560
+ raise NotImplementedError
1561
+
1562
+ @abstractmethod
1563
+ def visit_extend(self, op: Extend) -> T:
1564
+ raise NotImplementedError
1565
+
1566
+ @abstractmethod
1567
+ def visit_load_global(self, op: LoadGlobal) -> T:
1568
+ raise NotImplementedError
1569
+
1570
+ @abstractmethod
1571
+ def visit_int_op(self, op: IntOp) -> T:
1572
+ raise NotImplementedError
1573
+
1574
+ @abstractmethod
1575
+ def visit_comparison_op(self, op: ComparisonOp) -> T:
1576
+ raise NotImplementedError
1577
+
1578
+ @abstractmethod
1579
+ def visit_float_op(self, op: FloatOp) -> T:
1580
+ raise NotImplementedError
1581
+
1582
+ @abstractmethod
1583
+ def visit_float_neg(self, op: FloatNeg) -> T:
1584
+ raise NotImplementedError
1585
+
1586
+ @abstractmethod
1587
+ def visit_float_comparison_op(self, op: FloatComparisonOp) -> T:
1588
+ raise NotImplementedError
1589
+
1590
+ @abstractmethod
1591
+ def visit_load_mem(self, op: LoadMem) -> T:
1592
+ raise NotImplementedError
1593
+
1594
+ @abstractmethod
1595
+ def visit_set_mem(self, op: SetMem) -> T:
1596
+ raise NotImplementedError
1597
+
1598
+ @abstractmethod
1599
+ def visit_get_element_ptr(self, op: GetElementPtr) -> T:
1600
+ raise NotImplementedError
1601
+
1602
+ @abstractmethod
1603
+ def visit_load_address(self, op: LoadAddress) -> T:
1604
+ raise NotImplementedError
1605
+
1606
+ @abstractmethod
1607
+ def visit_keep_alive(self, op: KeepAlive) -> T:
1608
+ raise NotImplementedError
1609
+
1610
+ @abstractmethod
1611
+ def visit_unborrow(self, op: Unborrow) -> T:
1612
+ raise NotImplementedError
1613
+
1614
+
1615
+ # TODO: Should the following definition live somewhere else?
1616
+
1617
+
1618
+ # We do a three-pass deserialization scheme in order to resolve name
1619
+ # references.
1620
+ # 1. Create an empty ClassIR for each class in an SCC.
1621
+ # 2. Deserialize all of the functions, which can contain references
1622
+ # to ClassIRs in their types
1623
+ # 3. Deserialize all of the classes, which contain lots of references
1624
+ # to the functions they contain. (And to other classes.)
1625
+ #
1626
+ # Note that this approach differs from how we deserialize ASTs in mypy itself,
1627
+ # where everything is deserialized in one pass then a second pass cleans up
1628
+ # 'cross_refs'. We don't follow that approach here because it seems to be more
1629
+ # code for not a lot of gain since it is easy in mypyc to identify all the objects
1630
+ # we might need to reference.
1631
+ #
1632
+ # Because of these references, we need to maintain maps from class
1633
+ # names to ClassIRs and func IDs to FuncIRs.
1634
+ #
1635
+ # These are tracked in a DeserMaps which is passed to every
1636
+ # deserialization function.
1637
+ #
1638
+ # (Serialization and deserialization *will* be used for incremental
1639
+ # compilation but so far it is not hooked up to anything.)
1640
+ class DeserMaps(NamedTuple):
1641
+ classes: dict[str, ClassIR]
1642
+ functions: dict[str, FuncIR]