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
@@ -0,0 +1,1060 @@
1
+ """Code generation for native classes and related wrappers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Callable, Mapping, Tuple
6
+
7
+ from mypyc.codegen.emit import Emitter, HeaderDeclaration, ReturnHandler
8
+ from mypyc.codegen.emitfunc import native_function_header
9
+ from mypyc.codegen.emitwrapper import (
10
+ generate_bin_op_wrapper,
11
+ generate_bool_wrapper,
12
+ generate_contains_wrapper,
13
+ generate_dunder_wrapper,
14
+ generate_get_wrapper,
15
+ generate_hash_wrapper,
16
+ generate_ipow_wrapper,
17
+ generate_len_wrapper,
18
+ generate_richcompare_wrapper,
19
+ generate_set_del_item_wrapper,
20
+ )
21
+ from mypyc.common import BITMAP_BITS, BITMAP_TYPE, NATIVE_PREFIX, PREFIX, REG_PREFIX
22
+ from mypyc.ir.class_ir import ClassIR, VTableEntries
23
+ from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD, FuncDecl, FuncIR
24
+ from mypyc.ir.rtypes import RTuple, RType, object_rprimitive
25
+ from mypyc.namegen import NameGenerator
26
+ from mypyc.sametype import is_same_type
27
+
28
+
29
+ def native_slot(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
30
+ return f"{NATIVE_PREFIX}{fn.cname(emitter.names)}"
31
+
32
+
33
+ def wrapper_slot(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
34
+ return f"{PREFIX}{fn.cname(emitter.names)}"
35
+
36
+
37
+ # We maintain a table from dunder function names to struct slots they
38
+ # correspond to and functions that generate a wrapper (if necessary)
39
+ # and return the function name to stick in the slot.
40
+ # TODO: Add remaining dunder methods
41
+ SlotGenerator = Callable[[ClassIR, FuncIR, Emitter], str]
42
+ SlotTable = Mapping[str, Tuple[str, SlotGenerator]]
43
+
44
+ SLOT_DEFS: SlotTable = {
45
+ "__init__": ("tp_init", lambda c, t, e: generate_init_for_class(c, t, e)),
46
+ "__call__": ("tp_call", lambda c, t, e: generate_call_wrapper(c, t, e)),
47
+ "__str__": ("tp_str", native_slot),
48
+ "__repr__": ("tp_repr", native_slot),
49
+ "__next__": ("tp_iternext", native_slot),
50
+ "__iter__": ("tp_iter", native_slot),
51
+ "__hash__": ("tp_hash", generate_hash_wrapper),
52
+ "__get__": ("tp_descr_get", generate_get_wrapper),
53
+ }
54
+
55
+ AS_MAPPING_SLOT_DEFS: SlotTable = {
56
+ "__getitem__": ("mp_subscript", generate_dunder_wrapper),
57
+ "__setitem__": ("mp_ass_subscript", generate_set_del_item_wrapper),
58
+ "__delitem__": ("mp_ass_subscript", generate_set_del_item_wrapper),
59
+ "__len__": ("mp_length", generate_len_wrapper),
60
+ }
61
+
62
+ AS_SEQUENCE_SLOT_DEFS: SlotTable = {"__contains__": ("sq_contains", generate_contains_wrapper)}
63
+
64
+ AS_NUMBER_SLOT_DEFS: SlotTable = {
65
+ # Unary operations.
66
+ "__bool__": ("nb_bool", generate_bool_wrapper),
67
+ "__int__": ("nb_int", generate_dunder_wrapper),
68
+ "__float__": ("nb_float", generate_dunder_wrapper),
69
+ "__neg__": ("nb_negative", generate_dunder_wrapper),
70
+ "__pos__": ("nb_positive", generate_dunder_wrapper),
71
+ "__abs__": ("nb_absolute", generate_dunder_wrapper),
72
+ "__invert__": ("nb_invert", generate_dunder_wrapper),
73
+ # Binary operations.
74
+ "__add__": ("nb_add", generate_bin_op_wrapper),
75
+ "__radd__": ("nb_add", generate_bin_op_wrapper),
76
+ "__sub__": ("nb_subtract", generate_bin_op_wrapper),
77
+ "__rsub__": ("nb_subtract", generate_bin_op_wrapper),
78
+ "__mul__": ("nb_multiply", generate_bin_op_wrapper),
79
+ "__rmul__": ("nb_multiply", generate_bin_op_wrapper),
80
+ "__mod__": ("nb_remainder", generate_bin_op_wrapper),
81
+ "__rmod__": ("nb_remainder", generate_bin_op_wrapper),
82
+ "__truediv__": ("nb_true_divide", generate_bin_op_wrapper),
83
+ "__rtruediv__": ("nb_true_divide", generate_bin_op_wrapper),
84
+ "__floordiv__": ("nb_floor_divide", generate_bin_op_wrapper),
85
+ "__rfloordiv__": ("nb_floor_divide", generate_bin_op_wrapper),
86
+ "__divmod__": ("nb_divmod", generate_bin_op_wrapper),
87
+ "__rdivmod__": ("nb_divmod", generate_bin_op_wrapper),
88
+ "__lshift__": ("nb_lshift", generate_bin_op_wrapper),
89
+ "__rlshift__": ("nb_lshift", generate_bin_op_wrapper),
90
+ "__rshift__": ("nb_rshift", generate_bin_op_wrapper),
91
+ "__rrshift__": ("nb_rshift", generate_bin_op_wrapper),
92
+ "__and__": ("nb_and", generate_bin_op_wrapper),
93
+ "__rand__": ("nb_and", generate_bin_op_wrapper),
94
+ "__or__": ("nb_or", generate_bin_op_wrapper),
95
+ "__ror__": ("nb_or", generate_bin_op_wrapper),
96
+ "__xor__": ("nb_xor", generate_bin_op_wrapper),
97
+ "__rxor__": ("nb_xor", generate_bin_op_wrapper),
98
+ "__matmul__": ("nb_matrix_multiply", generate_bin_op_wrapper),
99
+ "__rmatmul__": ("nb_matrix_multiply", generate_bin_op_wrapper),
100
+ # In-place binary operations.
101
+ "__iadd__": ("nb_inplace_add", generate_dunder_wrapper),
102
+ "__isub__": ("nb_inplace_subtract", generate_dunder_wrapper),
103
+ "__imul__": ("nb_inplace_multiply", generate_dunder_wrapper),
104
+ "__imod__": ("nb_inplace_remainder", generate_dunder_wrapper),
105
+ "__itruediv__": ("nb_inplace_true_divide", generate_dunder_wrapper),
106
+ "__ifloordiv__": ("nb_inplace_floor_divide", generate_dunder_wrapper),
107
+ "__ilshift__": ("nb_inplace_lshift", generate_dunder_wrapper),
108
+ "__irshift__": ("nb_inplace_rshift", generate_dunder_wrapper),
109
+ "__iand__": ("nb_inplace_and", generate_dunder_wrapper),
110
+ "__ior__": ("nb_inplace_or", generate_dunder_wrapper),
111
+ "__ixor__": ("nb_inplace_xor", generate_dunder_wrapper),
112
+ "__imatmul__": ("nb_inplace_matrix_multiply", generate_dunder_wrapper),
113
+ # Ternary operations. (yes, really)
114
+ # These are special cased in generate_bin_op_wrapper().
115
+ "__pow__": ("nb_power", generate_bin_op_wrapper),
116
+ "__rpow__": ("nb_power", generate_bin_op_wrapper),
117
+ "__ipow__": ("nb_inplace_power", generate_ipow_wrapper),
118
+ }
119
+
120
+ AS_ASYNC_SLOT_DEFS: SlotTable = {
121
+ "__await__": ("am_await", native_slot),
122
+ "__aiter__": ("am_aiter", native_slot),
123
+ "__anext__": ("am_anext", native_slot),
124
+ }
125
+
126
+ SIDE_TABLES = [
127
+ ("as_mapping", "PyMappingMethods", AS_MAPPING_SLOT_DEFS),
128
+ ("as_sequence", "PySequenceMethods", AS_SEQUENCE_SLOT_DEFS),
129
+ ("as_number", "PyNumberMethods", AS_NUMBER_SLOT_DEFS),
130
+ ("as_async", "PyAsyncMethods", AS_ASYNC_SLOT_DEFS),
131
+ ]
132
+
133
+ # Slots that need to always be filled in because they don't get
134
+ # inherited right.
135
+ ALWAYS_FILL = {"__hash__"}
136
+
137
+
138
+ def generate_call_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
139
+ if emitter.use_vectorcall():
140
+ # Use vectorcall wrapper if supported (PEP 590).
141
+ return "PyVectorcall_Call"
142
+ else:
143
+ # On older Pythons use the legacy wrapper.
144
+ return wrapper_slot(cl, fn, emitter)
145
+
146
+
147
+ def slot_key(attr: str) -> str:
148
+ """Map dunder method name to sort key.
149
+
150
+ Sort reverse operator methods and __delitem__ after others ('x' > '_').
151
+ """
152
+ if (attr.startswith("__r") and attr != "__rshift__") or attr == "__delitem__":
153
+ return "x" + attr
154
+ return attr
155
+
156
+
157
+ def generate_slots(cl: ClassIR, table: SlotTable, emitter: Emitter) -> dict[str, str]:
158
+ fields: dict[str, str] = {}
159
+ generated: dict[str, str] = {}
160
+ # Sort for determinism on Python 3.5
161
+ for name, (slot, generator) in sorted(table.items(), key=lambda x: slot_key(x[0])):
162
+ method_cls = cl.get_method_and_class(name)
163
+ if method_cls and (method_cls[1] == cl or name in ALWAYS_FILL):
164
+ if slot in generated:
165
+ # Reuse previously generated wrapper.
166
+ fields[slot] = generated[slot]
167
+ else:
168
+ # Generate new wrapper.
169
+ name = generator(cl, method_cls[0], emitter)
170
+ fields[slot] = name
171
+ generated[slot] = name
172
+
173
+ return fields
174
+
175
+
176
+ def generate_class_type_decl(
177
+ cl: ClassIR, c_emitter: Emitter, external_emitter: Emitter, emitter: Emitter
178
+ ) -> None:
179
+ context = c_emitter.context
180
+ name = emitter.type_struct_name(cl)
181
+ context.declarations[name] = HeaderDeclaration(
182
+ f"PyTypeObject *{emitter.type_struct_name(cl)};", needs_export=True
183
+ )
184
+
185
+ # If this is a non-extension class, all we want is the type object decl.
186
+ if not cl.is_ext_class:
187
+ return
188
+
189
+ generate_object_struct(cl, external_emitter)
190
+ generate_full = not cl.is_trait and not cl.builtin_base
191
+ if generate_full:
192
+ context.declarations[emitter.native_function_name(cl.ctor)] = HeaderDeclaration(
193
+ f"{native_function_header(cl.ctor, emitter)};", needs_export=True
194
+ )
195
+
196
+
197
+ def generate_class(cl: ClassIR, module: str, emitter: Emitter) -> None:
198
+ """Generate C code for a class.
199
+
200
+ This is the main entry point to the module.
201
+ """
202
+ name = cl.name
203
+ name_prefix = cl.name_prefix(emitter.names)
204
+
205
+ setup_name = f"{name_prefix}_setup"
206
+ new_name = f"{name_prefix}_new"
207
+ members_name = f"{name_prefix}_members"
208
+ getseters_name = f"{name_prefix}_getseters"
209
+ vtable_name = f"{name_prefix}_vtable"
210
+ traverse_name = f"{name_prefix}_traverse"
211
+ clear_name = f"{name_prefix}_clear"
212
+ dealloc_name = f"{name_prefix}_dealloc"
213
+ methods_name = f"{name_prefix}_methods"
214
+ vtable_setup_name = f"{name_prefix}_trait_vtable_setup"
215
+
216
+ fields: dict[str, str] = {}
217
+ fields["tp_name"] = f'"{name}"'
218
+
219
+ generate_full = not cl.is_trait and not cl.builtin_base
220
+ needs_getseters = cl.needs_getseters or not cl.is_generated or cl.has_dict
221
+
222
+ if not cl.builtin_base:
223
+ fields["tp_new"] = new_name
224
+
225
+ if generate_full:
226
+ fields["tp_dealloc"] = f"(destructor){name_prefix}_dealloc"
227
+ fields["tp_traverse"] = f"(traverseproc){name_prefix}_traverse"
228
+ fields["tp_clear"] = f"(inquiry){name_prefix}_clear"
229
+ if needs_getseters:
230
+ fields["tp_getset"] = getseters_name
231
+ fields["tp_methods"] = methods_name
232
+
233
+ def emit_line() -> None:
234
+ emitter.emit_line()
235
+
236
+ emit_line()
237
+
238
+ # If the class has a method to initialize default attribute
239
+ # values, we need to call it during initialization.
240
+ defaults_fn = cl.get_method("__mypyc_defaults_setup")
241
+
242
+ # If there is a __init__ method, we'll use it in the native constructor.
243
+ init_fn = cl.get_method("__init__")
244
+
245
+ # Fill out slots in the type object from dunder methods.
246
+ fields.update(generate_slots(cl, SLOT_DEFS, emitter))
247
+
248
+ # Fill out dunder methods that live in tables hanging off the side.
249
+ for table_name, type, slot_defs in SIDE_TABLES:
250
+ slots = generate_slots(cl, slot_defs, emitter)
251
+ if slots:
252
+ table_struct_name = generate_side_table_for_class(cl, table_name, type, slots, emitter)
253
+ fields[f"tp_{table_name}"] = f"&{table_struct_name}"
254
+
255
+ richcompare_name = generate_richcompare_wrapper(cl, emitter)
256
+ if richcompare_name:
257
+ fields["tp_richcompare"] = richcompare_name
258
+
259
+ # If the class inherits from python, make space for a __dict__
260
+ struct_name = cl.struct_name(emitter.names)
261
+ if cl.builtin_base:
262
+ base_size = f"sizeof({cl.builtin_base})"
263
+ elif cl.is_trait:
264
+ base_size = "sizeof(PyObject)"
265
+ else:
266
+ base_size = f"sizeof({struct_name})"
267
+ # Since our types aren't allocated using type() we need to
268
+ # populate these fields ourselves if we want them to have correct
269
+ # values. PyType_Ready will inherit the offsets from tp_base but
270
+ # that isn't what we want.
271
+
272
+ # XXX: there is no reason for the __weakref__ stuff to be mixed up with __dict__
273
+ if cl.has_dict and not has_managed_dict(cl, emitter):
274
+ # __dict__ lives right after the struct and __weakref__ lives right after that
275
+ # TODO: They should get members in the struct instead of doing this nonsense.
276
+ weak_offset = f"{base_size} + sizeof(PyObject *)"
277
+ emitter.emit_lines(
278
+ f"PyMemberDef {members_name}[] = {{",
279
+ f'{{"__dict__", T_OBJECT_EX, {base_size}, 0, NULL}},',
280
+ f'{{"__weakref__", T_OBJECT_EX, {weak_offset}, 0, NULL}},',
281
+ "{0}",
282
+ "};",
283
+ )
284
+
285
+ fields["tp_members"] = members_name
286
+ fields["tp_basicsize"] = f"{base_size} + 2*sizeof(PyObject *)"
287
+ if emitter.capi_version < (3, 12):
288
+ fields["tp_dictoffset"] = base_size
289
+ fields["tp_weaklistoffset"] = weak_offset
290
+ else:
291
+ fields["tp_basicsize"] = base_size
292
+
293
+ if generate_full:
294
+ # Declare setup method that allocates and initializes an object. type is the
295
+ # type of the class being initialized, which could be another class if there
296
+ # is an interpreted subclass.
297
+ emitter.emit_line(f"static PyObject *{setup_name}(PyTypeObject *type);")
298
+ assert cl.ctor is not None
299
+ emitter.emit_line(native_function_header(cl.ctor, emitter) + ";")
300
+
301
+ emit_line()
302
+ init_fn = cl.get_method("__init__")
303
+ generate_new_for_class(cl, new_name, vtable_name, setup_name, init_fn, emitter)
304
+ emit_line()
305
+ generate_traverse_for_class(cl, traverse_name, emitter)
306
+ emit_line()
307
+ generate_clear_for_class(cl, clear_name, emitter)
308
+ emit_line()
309
+ generate_dealloc_for_class(cl, dealloc_name, clear_name, emitter)
310
+ emit_line()
311
+
312
+ if cl.allow_interpreted_subclasses:
313
+ shadow_vtable_name: str | None = generate_vtables(
314
+ cl, vtable_setup_name + "_shadow", vtable_name + "_shadow", emitter, shadow=True
315
+ )
316
+ emit_line()
317
+ else:
318
+ shadow_vtable_name = None
319
+ vtable_name = generate_vtables(cl, vtable_setup_name, vtable_name, emitter, shadow=False)
320
+ emit_line()
321
+ if needs_getseters:
322
+ generate_getseter_declarations(cl, emitter)
323
+ emit_line()
324
+ generate_getseters_table(cl, getseters_name, emitter)
325
+ emit_line()
326
+
327
+ if cl.is_trait:
328
+ generate_new_for_trait(cl, new_name, emitter)
329
+
330
+ generate_methods_table(cl, methods_name, emitter)
331
+ emit_line()
332
+
333
+ flags = ["Py_TPFLAGS_DEFAULT", "Py_TPFLAGS_HEAPTYPE", "Py_TPFLAGS_BASETYPE"]
334
+ if generate_full:
335
+ flags.append("Py_TPFLAGS_HAVE_GC")
336
+ if cl.has_method("__call__") and emitter.use_vectorcall():
337
+ fields["tp_vectorcall_offset"] = "offsetof({}, vectorcall)".format(
338
+ cl.struct_name(emitter.names)
339
+ )
340
+ flags.append("_Py_TPFLAGS_HAVE_VECTORCALL")
341
+ if not fields.get("tp_vectorcall"):
342
+ # This is just a placeholder to please CPython. It will be
343
+ # overridden during setup.
344
+ fields["tp_call"] = "PyVectorcall_Call"
345
+ if has_managed_dict(cl, emitter):
346
+ flags.append("Py_TPFLAGS_MANAGED_DICT")
347
+ fields["tp_flags"] = " | ".join(flags)
348
+
349
+ emitter.emit_line(f"static PyTypeObject {emitter.type_struct_name(cl)}_template_ = {{")
350
+ emitter.emit_line("PyVarObject_HEAD_INIT(NULL, 0)")
351
+ for field, value in fields.items():
352
+ emitter.emit_line(f".{field} = {value},")
353
+ emitter.emit_line("};")
354
+ emitter.emit_line(
355
+ "static PyTypeObject *{t}_template = &{t}_template_;".format(
356
+ t=emitter.type_struct_name(cl)
357
+ )
358
+ )
359
+
360
+ emitter.emit_line()
361
+ if generate_full:
362
+ generate_setup_for_class(
363
+ cl, setup_name, defaults_fn, vtable_name, shadow_vtable_name, emitter
364
+ )
365
+ emitter.emit_line()
366
+ generate_constructor_for_class(cl, cl.ctor, init_fn, setup_name, vtable_name, emitter)
367
+ emitter.emit_line()
368
+ if needs_getseters:
369
+ generate_getseters(cl, emitter)
370
+
371
+
372
+ def getter_name(cl: ClassIR, attribute: str, names: NameGenerator) -> str:
373
+ return names.private_name(cl.module_name, f"{cl.name}_get_{attribute}")
374
+
375
+
376
+ def setter_name(cl: ClassIR, attribute: str, names: NameGenerator) -> str:
377
+ return names.private_name(cl.module_name, f"{cl.name}_set_{attribute}")
378
+
379
+
380
+ def generate_object_struct(cl: ClassIR, emitter: Emitter) -> None:
381
+ seen_attrs: set[tuple[str, RType]] = set()
382
+ lines: list[str] = []
383
+ lines += ["typedef struct {", "PyObject_HEAD", "CPyVTableItem *vtable;"]
384
+ if cl.has_method("__call__") and emitter.use_vectorcall():
385
+ lines.append("vectorcallfunc vectorcall;")
386
+ bitmap_attrs = []
387
+ for base in reversed(cl.base_mro):
388
+ if not base.is_trait:
389
+ if base.bitmap_attrs:
390
+ # Do we need another attribute bitmap field?
391
+ if emitter.bitmap_field(len(base.bitmap_attrs) - 1) not in bitmap_attrs:
392
+ for i in range(0, len(base.bitmap_attrs), BITMAP_BITS):
393
+ attr = emitter.bitmap_field(i)
394
+ if attr not in bitmap_attrs:
395
+ lines.append(f"{BITMAP_TYPE} {attr};")
396
+ bitmap_attrs.append(attr)
397
+ for attr, rtype in base.attributes.items():
398
+ if (attr, rtype) not in seen_attrs:
399
+ lines.append(f"{emitter.ctype_spaced(rtype)}{emitter.attr(attr)};")
400
+ seen_attrs.add((attr, rtype))
401
+
402
+ if isinstance(rtype, RTuple):
403
+ emitter.declare_tuple_struct(rtype)
404
+
405
+ lines.append(f"}} {cl.struct_name(emitter.names)};")
406
+ lines.append("")
407
+ emitter.context.declarations[cl.struct_name(emitter.names)] = HeaderDeclaration(
408
+ lines, is_type=True
409
+ )
410
+
411
+
412
+ def generate_vtables(
413
+ base: ClassIR, vtable_setup_name: str, vtable_name: str, emitter: Emitter, shadow: bool
414
+ ) -> str:
415
+ """Emit the vtables and vtable setup functions for a class.
416
+
417
+ This includes both the primary vtable and any trait implementation vtables.
418
+ The trait vtables go before the main vtable, and have the following layout:
419
+ {
420
+ CPyType_T1, // pointer to type object
421
+ C_T1_trait_vtable, // pointer to array of method pointers
422
+ C_T1_offset_table, // pointer to array of attribute offsets
423
+ CPyType_T2,
424
+ C_T2_trait_vtable,
425
+ C_T2_offset_table,
426
+ ...
427
+ }
428
+ The method implementations are calculated at the end of IR pass, attribute
429
+ offsets are {offsetof(native__C, _x1), offsetof(native__C, _y1), ...}.
430
+
431
+ To account for both dynamic loading and dynamic class creation,
432
+ vtables are populated dynamically at class creation time, so we
433
+ emit empty array definitions to store the vtables and a function to
434
+ populate them.
435
+
436
+ If shadow is True, generate "shadow vtables" that point to the
437
+ shadow glue methods (which should dispatch via the Python C-API).
438
+
439
+ Returns the expression to use to refer to the vtable, which might be
440
+ different than the name, if there are trait vtables.
441
+ """
442
+
443
+ def trait_vtable_name(trait: ClassIR) -> str:
444
+ return "{}_{}_trait_vtable{}".format(
445
+ base.name_prefix(emitter.names),
446
+ trait.name_prefix(emitter.names),
447
+ "_shadow" if shadow else "",
448
+ )
449
+
450
+ def trait_offset_table_name(trait: ClassIR) -> str:
451
+ return "{}_{}_offset_table".format(
452
+ base.name_prefix(emitter.names), trait.name_prefix(emitter.names)
453
+ )
454
+
455
+ # Emit array definitions with enough space for all the entries
456
+ emitter.emit_line(
457
+ "static CPyVTableItem {}[{}];".format(
458
+ vtable_name, max(1, len(base.vtable_entries) + 3 * len(base.trait_vtables))
459
+ )
460
+ )
461
+
462
+ for trait, vtable in base.trait_vtables.items():
463
+ # Trait methods entry (vtable index -> method implementation).
464
+ emitter.emit_line(
465
+ f"static CPyVTableItem {trait_vtable_name(trait)}[{max(1, len(vtable))}];"
466
+ )
467
+ # Trait attributes entry (attribute number in trait -> offset in actual struct).
468
+ emitter.emit_line(
469
+ "static size_t {}[{}];".format(
470
+ trait_offset_table_name(trait), max(1, len(trait.attributes))
471
+ )
472
+ )
473
+
474
+ # Emit vtable setup function
475
+ emitter.emit_line("static bool")
476
+ emitter.emit_line(f"{NATIVE_PREFIX}{vtable_setup_name}(void)")
477
+ emitter.emit_line("{")
478
+
479
+ if base.allow_interpreted_subclasses and not shadow:
480
+ emitter.emit_line(f"{NATIVE_PREFIX}{vtable_setup_name}_shadow();")
481
+
482
+ subtables = []
483
+ for trait, vtable in base.trait_vtables.items():
484
+ name = trait_vtable_name(trait)
485
+ offset_name = trait_offset_table_name(trait)
486
+ generate_vtable(vtable, name, emitter, [], shadow)
487
+ generate_offset_table(offset_name, emitter, trait, base)
488
+ subtables.append((trait, name, offset_name))
489
+
490
+ generate_vtable(base.vtable_entries, vtable_name, emitter, subtables, shadow)
491
+
492
+ emitter.emit_line("return 1;")
493
+ emitter.emit_line("}")
494
+
495
+ return vtable_name if not subtables else f"{vtable_name} + {len(subtables) * 3}"
496
+
497
+
498
+ def generate_offset_table(
499
+ trait_offset_table_name: str, emitter: Emitter, trait: ClassIR, cl: ClassIR
500
+ ) -> None:
501
+ """Generate attribute offset row of a trait vtable."""
502
+ emitter.emit_line(f"size_t {trait_offset_table_name}_scratch[] = {{")
503
+ for attr in trait.attributes:
504
+ emitter.emit_line(f"offsetof({cl.struct_name(emitter.names)}, {emitter.attr(attr)}),")
505
+ if not trait.attributes:
506
+ # This is for msvc.
507
+ emitter.emit_line("0")
508
+ emitter.emit_line("};")
509
+ emitter.emit_line(
510
+ "memcpy({name}, {name}_scratch, sizeof({name}));".format(name=trait_offset_table_name)
511
+ )
512
+
513
+
514
+ def generate_vtable(
515
+ entries: VTableEntries,
516
+ vtable_name: str,
517
+ emitter: Emitter,
518
+ subtables: list[tuple[ClassIR, str, str]],
519
+ shadow: bool,
520
+ ) -> None:
521
+ emitter.emit_line(f"CPyVTableItem {vtable_name}_scratch[] = {{")
522
+ if subtables:
523
+ emitter.emit_line("/* Array of trait vtables */")
524
+ for trait, table, offset_table in subtables:
525
+ emitter.emit_line(
526
+ "(CPyVTableItem){}, (CPyVTableItem){}, (CPyVTableItem){},".format(
527
+ emitter.type_struct_name(trait), table, offset_table
528
+ )
529
+ )
530
+ emitter.emit_line("/* Start of real vtable */")
531
+
532
+ for entry in entries:
533
+ method = entry.shadow_method if shadow and entry.shadow_method else entry.method
534
+ emitter.emit_line(
535
+ "(CPyVTableItem){}{}{},".format(
536
+ emitter.get_group_prefix(entry.method.decl),
537
+ NATIVE_PREFIX,
538
+ method.cname(emitter.names),
539
+ )
540
+ )
541
+
542
+ # msvc doesn't allow empty arrays; maybe allowing them at all is an extension?
543
+ if not entries:
544
+ emitter.emit_line("NULL")
545
+ emitter.emit_line("};")
546
+ emitter.emit_line("memcpy({name}, {name}_scratch, sizeof({name}));".format(name=vtable_name))
547
+
548
+
549
+ def generate_setup_for_class(
550
+ cl: ClassIR,
551
+ func_name: str,
552
+ defaults_fn: FuncIR | None,
553
+ vtable_name: str,
554
+ shadow_vtable_name: str | None,
555
+ emitter: Emitter,
556
+ ) -> None:
557
+ """Generate a native function that allocates an instance of a class."""
558
+ emitter.emit_line("static PyObject *")
559
+ emitter.emit_line(f"{func_name}(PyTypeObject *type)")
560
+ emitter.emit_line("{")
561
+ emitter.emit_line(f"{cl.struct_name(emitter.names)} *self;")
562
+ emitter.emit_line(f"self = ({cl.struct_name(emitter.names)} *)type->tp_alloc(type, 0);")
563
+ emitter.emit_line("if (self == NULL)")
564
+ emitter.emit_line(" return NULL;")
565
+
566
+ if shadow_vtable_name:
567
+ emitter.emit_line(f"if (type != {emitter.type_struct_name(cl)}) {{")
568
+ emitter.emit_line(f"self->vtable = {shadow_vtable_name};")
569
+ emitter.emit_line("} else {")
570
+ emitter.emit_line(f"self->vtable = {vtable_name};")
571
+ emitter.emit_line("}")
572
+ else:
573
+ emitter.emit_line(f"self->vtable = {vtable_name};")
574
+ for i in range(0, len(cl.bitmap_attrs), BITMAP_BITS):
575
+ field = emitter.bitmap_field(i)
576
+ emitter.emit_line(f"self->{field} = 0;")
577
+
578
+ if cl.has_method("__call__") and emitter.use_vectorcall():
579
+ name = cl.method_decl("__call__").cname(emitter.names)
580
+ emitter.emit_line(f"self->vectorcall = {PREFIX}{name};")
581
+
582
+ for base in reversed(cl.base_mro):
583
+ for attr, rtype in base.attributes.items():
584
+ value = emitter.c_undefined_value(rtype)
585
+
586
+ # We don't need to set this field to NULL since tp_alloc() already
587
+ # zero-initializes `self`.
588
+ if value != "NULL":
589
+ emitter.emit_line(rf"self->{emitter.attr(attr)} = {value};")
590
+
591
+ # Initialize attributes to default values, if necessary
592
+ if defaults_fn is not None:
593
+ emitter.emit_lines(
594
+ "if ({}{}((PyObject *)self) == 0) {{".format(
595
+ NATIVE_PREFIX, defaults_fn.cname(emitter.names)
596
+ ),
597
+ "Py_DECREF(self);",
598
+ "return NULL;",
599
+ "}",
600
+ )
601
+
602
+ emitter.emit_line("return (PyObject *)self;")
603
+ emitter.emit_line("}")
604
+
605
+
606
+ def generate_constructor_for_class(
607
+ cl: ClassIR,
608
+ fn: FuncDecl,
609
+ init_fn: FuncIR | None,
610
+ setup_name: str,
611
+ vtable_name: str,
612
+ emitter: Emitter,
613
+ ) -> None:
614
+ """Generate a native function that allocates and initializes an instance of a class."""
615
+ emitter.emit_line(f"{native_function_header(fn, emitter)}")
616
+ emitter.emit_line("{")
617
+ emitter.emit_line(f"PyObject *self = {setup_name}({emitter.type_struct_name(cl)});")
618
+ emitter.emit_line("if (self == NULL)")
619
+ emitter.emit_line(" return NULL;")
620
+ args = ", ".join(["self"] + [REG_PREFIX + arg.name for arg in fn.sig.args])
621
+ if init_fn is not None:
622
+ emitter.emit_line(
623
+ "char res = {}{}{}({});".format(
624
+ emitter.get_group_prefix(init_fn.decl),
625
+ NATIVE_PREFIX,
626
+ init_fn.cname(emitter.names),
627
+ args,
628
+ )
629
+ )
630
+ emitter.emit_line("if (res == 2) {")
631
+ emitter.emit_line("Py_DECREF(self);")
632
+ emitter.emit_line("return NULL;")
633
+ emitter.emit_line("}")
634
+
635
+ # If there is a nontrivial ctor that we didn't define, invoke it via tp_init
636
+ elif len(fn.sig.args) > 1:
637
+ emitter.emit_line(f"int res = {emitter.type_struct_name(cl)}->tp_init({args});")
638
+
639
+ emitter.emit_line("if (res < 0) {")
640
+ emitter.emit_line("Py_DECREF(self);")
641
+ emitter.emit_line("return NULL;")
642
+ emitter.emit_line("}")
643
+
644
+ emitter.emit_line("return self;")
645
+ emitter.emit_line("}")
646
+
647
+
648
+ def generate_init_for_class(cl: ClassIR, init_fn: FuncIR, emitter: Emitter) -> str:
649
+ """Generate an init function suitable for use as tp_init.
650
+
651
+ tp_init needs to be a function that returns an int, and our
652
+ __init__ methods return a PyObject. Translate NULL to -1,
653
+ everything else to 0.
654
+ """
655
+ func_name = f"{cl.name_prefix(emitter.names)}_init"
656
+
657
+ emitter.emit_line("static int")
658
+ emitter.emit_line(f"{func_name}(PyObject *self, PyObject *args, PyObject *kwds)")
659
+ emitter.emit_line("{")
660
+ if cl.allow_interpreted_subclasses or cl.builtin_base:
661
+ emitter.emit_line(
662
+ "return {}{}(self, args, kwds) != NULL ? 0 : -1;".format(
663
+ PREFIX, init_fn.cname(emitter.names)
664
+ )
665
+ )
666
+ else:
667
+ emitter.emit_line("return 0;")
668
+ emitter.emit_line("}")
669
+
670
+ return func_name
671
+
672
+
673
+ def generate_new_for_class(
674
+ cl: ClassIR,
675
+ func_name: str,
676
+ vtable_name: str,
677
+ setup_name: str,
678
+ init_fn: FuncIR | None,
679
+ emitter: Emitter,
680
+ ) -> None:
681
+ emitter.emit_line("static PyObject *")
682
+ emitter.emit_line(f"{func_name}(PyTypeObject *type, PyObject *args, PyObject *kwds)")
683
+ emitter.emit_line("{")
684
+ # TODO: Check and unbox arguments
685
+ if not cl.allow_interpreted_subclasses:
686
+ emitter.emit_line(f"if (type != {emitter.type_struct_name(cl)}) {{")
687
+ emitter.emit_line(
688
+ 'PyErr_SetString(PyExc_TypeError, "interpreted classes cannot inherit from compiled");'
689
+ )
690
+ emitter.emit_line("return NULL;")
691
+ emitter.emit_line("}")
692
+
693
+ if not init_fn or cl.allow_interpreted_subclasses or cl.builtin_base or cl.is_serializable():
694
+ # Match Python semantics -- __new__ doesn't call __init__.
695
+ emitter.emit_line(f"return {setup_name}(type);")
696
+ else:
697
+ # __new__ of a native class implicitly calls __init__ so that we
698
+ # can enforce that instances are always properly initialized. This
699
+ # is needed to support always defined attributes.
700
+ emitter.emit_line(f"PyObject *self = {setup_name}(type);")
701
+ emitter.emit_lines("if (self == NULL)", " return NULL;")
702
+ emitter.emit_line(
703
+ f"PyObject *ret = {PREFIX}{init_fn.cname(emitter.names)}(self, args, kwds);"
704
+ )
705
+ emitter.emit_lines("if (ret == NULL)", " return NULL;")
706
+ emitter.emit_line("return self;")
707
+ emitter.emit_line("}")
708
+
709
+
710
+ def generate_new_for_trait(cl: ClassIR, func_name: str, emitter: Emitter) -> None:
711
+ emitter.emit_line("static PyObject *")
712
+ emitter.emit_line(f"{func_name}(PyTypeObject *type, PyObject *args, PyObject *kwds)")
713
+ emitter.emit_line("{")
714
+ emitter.emit_line(f"if (type != {emitter.type_struct_name(cl)}) {{")
715
+ emitter.emit_line(
716
+ "PyErr_SetString(PyExc_TypeError, "
717
+ '"interpreted classes cannot inherit from compiled traits");'
718
+ )
719
+ emitter.emit_line("} else {")
720
+ emitter.emit_line('PyErr_SetString(PyExc_TypeError, "traits may not be directly created");')
721
+ emitter.emit_line("}")
722
+ emitter.emit_line("return NULL;")
723
+ emitter.emit_line("}")
724
+
725
+
726
+ def generate_traverse_for_class(cl: ClassIR, func_name: str, emitter: Emitter) -> None:
727
+ """Emit function that performs cycle GC traversal of an instance."""
728
+ emitter.emit_line("static int")
729
+ emitter.emit_line(
730
+ f"{func_name}({cl.struct_name(emitter.names)} *self, visitproc visit, void *arg)"
731
+ )
732
+ emitter.emit_line("{")
733
+ for base in reversed(cl.base_mro):
734
+ for attr, rtype in base.attributes.items():
735
+ emitter.emit_gc_visit(f"self->{emitter.attr(attr)}", rtype)
736
+ if has_managed_dict(cl, emitter):
737
+ emitter.emit_line("_PyObject_VisitManagedDict((PyObject *)self, visit, arg);")
738
+ elif cl.has_dict:
739
+ struct_name = cl.struct_name(emitter.names)
740
+ # __dict__ lives right after the struct and __weakref__ lives right after that
741
+ emitter.emit_gc_visit(
742
+ f"*((PyObject **)((char *)self + sizeof({struct_name})))", object_rprimitive
743
+ )
744
+ emitter.emit_gc_visit(
745
+ f"*((PyObject **)((char *)self + sizeof(PyObject *) + sizeof({struct_name})))",
746
+ object_rprimitive,
747
+ )
748
+ emitter.emit_line("return 0;")
749
+ emitter.emit_line("}")
750
+
751
+
752
+ def generate_clear_for_class(cl: ClassIR, func_name: str, emitter: Emitter) -> None:
753
+ emitter.emit_line("static int")
754
+ emitter.emit_line(f"{func_name}({cl.struct_name(emitter.names)} *self)")
755
+ emitter.emit_line("{")
756
+ for base in reversed(cl.base_mro):
757
+ for attr, rtype in base.attributes.items():
758
+ emitter.emit_gc_clear(f"self->{emitter.attr(attr)}", rtype)
759
+ if has_managed_dict(cl, emitter):
760
+ emitter.emit_line("_PyObject_ClearManagedDict((PyObject *)self);")
761
+ elif cl.has_dict:
762
+ struct_name = cl.struct_name(emitter.names)
763
+ # __dict__ lives right after the struct and __weakref__ lives right after that
764
+ emitter.emit_gc_clear(
765
+ f"*((PyObject **)((char *)self + sizeof({struct_name})))", object_rprimitive
766
+ )
767
+ emitter.emit_gc_clear(
768
+ f"*((PyObject **)((char *)self + sizeof(PyObject *) + sizeof({struct_name})))",
769
+ object_rprimitive,
770
+ )
771
+ emitter.emit_line("return 0;")
772
+ emitter.emit_line("}")
773
+
774
+
775
+ def generate_dealloc_for_class(
776
+ cl: ClassIR, dealloc_func_name: str, clear_func_name: str, emitter: Emitter
777
+ ) -> None:
778
+ emitter.emit_line("static void")
779
+ emitter.emit_line(f"{dealloc_func_name}({cl.struct_name(emitter.names)} *self)")
780
+ emitter.emit_line("{")
781
+ emitter.emit_line("PyObject_GC_UnTrack(self);")
782
+ # The trashcan is needed to handle deep recursive deallocations
783
+ emitter.emit_line(f"CPy_TRASHCAN_BEGIN(self, {dealloc_func_name})")
784
+ emitter.emit_line(f"{clear_func_name}(self);")
785
+ emitter.emit_line("Py_TYPE(self)->tp_free((PyObject *)self);")
786
+ emitter.emit_line("CPy_TRASHCAN_END(self)")
787
+ emitter.emit_line("}")
788
+
789
+
790
+ def generate_methods_table(cl: ClassIR, name: str, emitter: Emitter) -> None:
791
+ emitter.emit_line(f"static PyMethodDef {name}[] = {{")
792
+ for fn in cl.methods.values():
793
+ if fn.decl.is_prop_setter or fn.decl.is_prop_getter:
794
+ continue
795
+ emitter.emit_line(f'{{"{fn.name}",')
796
+ emitter.emit_line(f" (PyCFunction){PREFIX}{fn.cname(emitter.names)},")
797
+ flags = ["METH_FASTCALL", "METH_KEYWORDS"]
798
+ if fn.decl.kind == FUNC_STATICMETHOD:
799
+ flags.append("METH_STATIC")
800
+ elif fn.decl.kind == FUNC_CLASSMETHOD:
801
+ flags.append("METH_CLASS")
802
+
803
+ emitter.emit_line(" {}, NULL}},".format(" | ".join(flags)))
804
+
805
+ # Provide a default __getstate__ and __setstate__
806
+ if not cl.has_method("__setstate__") and not cl.has_method("__getstate__"):
807
+ emitter.emit_lines(
808
+ '{"__setstate__", (PyCFunction)CPyPickle_SetState, METH_O, NULL},',
809
+ '{"__getstate__", (PyCFunction)CPyPickle_GetState, METH_NOARGS, NULL},',
810
+ )
811
+
812
+ emitter.emit_line("{NULL} /* Sentinel */")
813
+ emitter.emit_line("};")
814
+
815
+
816
+ def generate_side_table_for_class(
817
+ cl: ClassIR, name: str, type: str, slots: dict[str, str], emitter: Emitter
818
+ ) -> str | None:
819
+ name = f"{cl.name_prefix(emitter.names)}_{name}"
820
+ emitter.emit_line(f"static {type} {name} = {{")
821
+ for field, value in slots.items():
822
+ emitter.emit_line(f".{field} = {value},")
823
+ emitter.emit_line("};")
824
+ return name
825
+
826
+
827
+ def generate_getseter_declarations(cl: ClassIR, emitter: Emitter) -> None:
828
+ if not cl.is_trait:
829
+ for attr in cl.attributes:
830
+ emitter.emit_line("static PyObject *")
831
+ emitter.emit_line(
832
+ "{}({} *self, void *closure);".format(
833
+ getter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
834
+ )
835
+ )
836
+ emitter.emit_line("static int")
837
+ emitter.emit_line(
838
+ "{}({} *self, PyObject *value, void *closure);".format(
839
+ setter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
840
+ )
841
+ )
842
+
843
+ for prop, (getter, setter) in cl.properties.items():
844
+ if getter.decl.implicit:
845
+ continue
846
+
847
+ # Generate getter declaration
848
+ emitter.emit_line("static PyObject *")
849
+ emitter.emit_line(
850
+ "{}({} *self, void *closure);".format(
851
+ getter_name(cl, prop, emitter.names), cl.struct_name(emitter.names)
852
+ )
853
+ )
854
+
855
+ # Generate property setter declaration if a setter exists
856
+ if setter:
857
+ emitter.emit_line("static int")
858
+ emitter.emit_line(
859
+ "{}({} *self, PyObject *value, void *closure);".format(
860
+ setter_name(cl, prop, emitter.names), cl.struct_name(emitter.names)
861
+ )
862
+ )
863
+
864
+
865
+ def generate_getseters_table(cl: ClassIR, name: str, emitter: Emitter) -> None:
866
+ emitter.emit_line(f"static PyGetSetDef {name}[] = {{")
867
+ if not cl.is_trait:
868
+ for attr in cl.attributes:
869
+ emitter.emit_line(f'{{"{attr}",')
870
+ emitter.emit_line(
871
+ " (getter){}, (setter){},".format(
872
+ getter_name(cl, attr, emitter.names), setter_name(cl, attr, emitter.names)
873
+ )
874
+ )
875
+ emitter.emit_line(" NULL, NULL},")
876
+ for prop, (getter, setter) in cl.properties.items():
877
+ if getter.decl.implicit:
878
+ continue
879
+
880
+ emitter.emit_line(f'{{"{prop}",')
881
+ emitter.emit_line(f" (getter){getter_name(cl, prop, emitter.names)},")
882
+
883
+ if setter:
884
+ emitter.emit_line(f" (setter){setter_name(cl, prop, emitter.names)},")
885
+ emitter.emit_line("NULL, NULL},")
886
+ else:
887
+ emitter.emit_line("NULL, NULL, NULL},")
888
+
889
+ if cl.has_dict:
890
+ emitter.emit_line('{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},')
891
+
892
+ emitter.emit_line("{NULL} /* Sentinel */")
893
+ emitter.emit_line("};")
894
+
895
+
896
+ def generate_getseters(cl: ClassIR, emitter: Emitter) -> None:
897
+ if not cl.is_trait:
898
+ for i, (attr, rtype) in enumerate(cl.attributes.items()):
899
+ generate_getter(cl, attr, rtype, emitter)
900
+ emitter.emit_line("")
901
+ generate_setter(cl, attr, rtype, emitter)
902
+ if i < len(cl.attributes) - 1:
903
+ emitter.emit_line("")
904
+ for prop, (getter, setter) in cl.properties.items():
905
+ if getter.decl.implicit:
906
+ continue
907
+
908
+ rtype = getter.sig.ret_type
909
+ emitter.emit_line("")
910
+ generate_readonly_getter(cl, prop, rtype, getter, emitter)
911
+ if setter:
912
+ arg_type = setter.sig.args[1].type
913
+ emitter.emit_line("")
914
+ generate_property_setter(cl, prop, arg_type, setter, emitter)
915
+
916
+
917
+ def generate_getter(cl: ClassIR, attr: str, rtype: RType, emitter: Emitter) -> None:
918
+ attr_field = emitter.attr(attr)
919
+ emitter.emit_line("static PyObject *")
920
+ emitter.emit_line(
921
+ "{}({} *self, void *closure)".format(
922
+ getter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
923
+ )
924
+ )
925
+ emitter.emit_line("{")
926
+ attr_expr = f"self->{attr_field}"
927
+
928
+ # HACK: Don't consider refcounted values as always defined, since it's possible to
929
+ # access uninitialized values via 'gc.get_objects()'. Accessing non-refcounted
930
+ # values is benign.
931
+ always_defined = cl.is_always_defined(attr) and not rtype.is_refcounted
932
+
933
+ if not always_defined:
934
+ emitter.emit_undefined_attr_check(rtype, attr_expr, "==", "self", attr, cl, unlikely=True)
935
+ emitter.emit_line("PyErr_SetString(PyExc_AttributeError,")
936
+ emitter.emit_line(f' "attribute {repr(attr)} of {repr(cl.name)} undefined");')
937
+ emitter.emit_line("return NULL;")
938
+ emitter.emit_line("}")
939
+ emitter.emit_inc_ref(f"self->{attr_field}", rtype)
940
+ emitter.emit_box(f"self->{attr_field}", "retval", rtype, declare_dest=True)
941
+ emitter.emit_line("return retval;")
942
+ emitter.emit_line("}")
943
+
944
+
945
+ def generate_setter(cl: ClassIR, attr: str, rtype: RType, emitter: Emitter) -> None:
946
+ attr_field = emitter.attr(attr)
947
+ emitter.emit_line("static int")
948
+ emitter.emit_line(
949
+ "{}({} *self, PyObject *value, void *closure)".format(
950
+ setter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
951
+ )
952
+ )
953
+ emitter.emit_line("{")
954
+
955
+ deletable = cl.is_deletable(attr)
956
+ if not deletable:
957
+ emitter.emit_line("if (value == NULL) {")
958
+ emitter.emit_line("PyErr_SetString(PyExc_AttributeError,")
959
+ emitter.emit_line(
960
+ f' "{repr(cl.name)} object attribute {repr(attr)} cannot be deleted");'
961
+ )
962
+ emitter.emit_line("return -1;")
963
+ emitter.emit_line("}")
964
+
965
+ # HACK: Don't consider refcounted values as always defined, since it's possible to
966
+ # access uninitialized values via 'gc.get_objects()'. Accessing non-refcounted
967
+ # values is benign.
968
+ always_defined = cl.is_always_defined(attr) and not rtype.is_refcounted
969
+
970
+ if rtype.is_refcounted:
971
+ attr_expr = f"self->{attr_field}"
972
+ if not always_defined:
973
+ emitter.emit_undefined_attr_check(rtype, attr_expr, "!=", "self", attr, cl)
974
+ emitter.emit_dec_ref(f"self->{attr_field}", rtype)
975
+ if not always_defined:
976
+ emitter.emit_line("}")
977
+
978
+ if deletable:
979
+ emitter.emit_line("if (value != NULL) {")
980
+
981
+ if rtype.is_unboxed:
982
+ emitter.emit_unbox("value", "tmp", rtype, error=ReturnHandler("-1"), declare_dest=True)
983
+ elif is_same_type(rtype, object_rprimitive):
984
+ emitter.emit_line("PyObject *tmp = value;")
985
+ else:
986
+ emitter.emit_cast("value", "tmp", rtype, declare_dest=True)
987
+ emitter.emit_lines("if (!tmp)", " return -1;")
988
+ emitter.emit_inc_ref("tmp", rtype)
989
+ emitter.emit_line(f"self->{attr_field} = tmp;")
990
+ if rtype.error_overlap and not always_defined:
991
+ emitter.emit_attr_bitmap_set("tmp", "self", rtype, cl, attr)
992
+
993
+ if deletable:
994
+ emitter.emit_line("} else")
995
+ emitter.emit_line(f" self->{attr_field} = {emitter.c_undefined_value(rtype)};")
996
+ if rtype.error_overlap:
997
+ emitter.emit_attr_bitmap_clear("self", rtype, cl, attr)
998
+ emitter.emit_line("return 0;")
999
+ emitter.emit_line("}")
1000
+
1001
+
1002
+ def generate_readonly_getter(
1003
+ cl: ClassIR, attr: str, rtype: RType, func_ir: FuncIR, emitter: Emitter
1004
+ ) -> None:
1005
+ emitter.emit_line("static PyObject *")
1006
+ emitter.emit_line(
1007
+ "{}({} *self, void *closure)".format(
1008
+ getter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
1009
+ )
1010
+ )
1011
+ emitter.emit_line("{")
1012
+ if rtype.is_unboxed:
1013
+ emitter.emit_line(
1014
+ "{}retval = {}{}((PyObject *) self);".format(
1015
+ emitter.ctype_spaced(rtype), NATIVE_PREFIX, func_ir.cname(emitter.names)
1016
+ )
1017
+ )
1018
+ emitter.emit_error_check("retval", rtype, "return NULL;")
1019
+ emitter.emit_box("retval", "retbox", rtype, declare_dest=True)
1020
+ emitter.emit_line("return retbox;")
1021
+ else:
1022
+ emitter.emit_line(
1023
+ f"return {NATIVE_PREFIX}{func_ir.cname(emitter.names)}((PyObject *) self);"
1024
+ )
1025
+ emitter.emit_line("}")
1026
+
1027
+
1028
+ def generate_property_setter(
1029
+ cl: ClassIR, attr: str, arg_type: RType, func_ir: FuncIR, emitter: Emitter
1030
+ ) -> None:
1031
+ emitter.emit_line("static int")
1032
+ emitter.emit_line(
1033
+ "{}({} *self, PyObject *value, void *closure)".format(
1034
+ setter_name(cl, attr, emitter.names), cl.struct_name(emitter.names)
1035
+ )
1036
+ )
1037
+ emitter.emit_line("{")
1038
+ if arg_type.is_unboxed:
1039
+ emitter.emit_unbox("value", "tmp", arg_type, error=ReturnHandler("-1"), declare_dest=True)
1040
+ emitter.emit_line(
1041
+ f"{NATIVE_PREFIX}{func_ir.cname(emitter.names)}((PyObject *) self, tmp);"
1042
+ )
1043
+ else:
1044
+ emitter.emit_line(
1045
+ f"{NATIVE_PREFIX}{func_ir.cname(emitter.names)}((PyObject *) self, value);"
1046
+ )
1047
+ emitter.emit_line("return 0;")
1048
+ emitter.emit_line("}")
1049
+
1050
+
1051
+ def has_managed_dict(cl: ClassIR, emitter: Emitter) -> bool:
1052
+ """Should the class get the Py_TPFLAGS_MANAGED_DICT flag?"""
1053
+ # On 3.11 and earlier the flag doesn't exist and we use
1054
+ # tp_dictoffset instead. If a class inherits from Exception, the
1055
+ # flag conflicts with tp_dictoffset set in the base class.
1056
+ return (
1057
+ emitter.capi_version >= (3, 12)
1058
+ and cl.has_dict
1059
+ and cl.builtin_base != "PyBaseExceptionObject"
1060
+ )