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.
- mypy/__init__.py +1 -0
- mypy/__main__.py +37 -0
- mypy/api.py +94 -0
- mypy/applytype.py +156 -0
- mypy/argmap.py +268 -0
- mypy/binder.py +538 -0
- mypy/bogus_type.py +27 -0
- mypy/build.py +3562 -0
- mypy/checker.py +8372 -0
- mypy/checkexpr.py +6615 -0
- mypy/checkmember.py +1356 -0
- mypy/checkpattern.py +801 -0
- mypy/checkstrformat.py +1109 -0
- mypy/config_parser.py +670 -0
- mypy/constant_fold.py +187 -0
- mypy/constraints.py +1624 -0
- mypy/copytype.py +133 -0
- mypy/defaults.py +46 -0
- mypy/dmypy/__init__.py +0 -0
- mypy/dmypy/__main__.py +6 -0
- mypy/dmypy/client.py +749 -0
- mypy/dmypy_os.py +42 -0
- mypy/dmypy_server.py +1107 -0
- mypy/dmypy_util.py +117 -0
- mypy/erasetype.py +278 -0
- mypy/errorcodes.py +285 -0
- mypy/errors.py +1280 -0
- mypy/evalexpr.py +205 -0
- mypy/expandtype.py +510 -0
- mypy/exprtotype.py +206 -0
- mypy/fastparse.py +2147 -0
- mypy/find_sources.py +243 -0
- mypy/fixup.py +426 -0
- mypy/freetree.py +23 -0
- mypy/fscache.py +309 -0
- mypy/fswatcher.py +106 -0
- mypy/gclogger.py +47 -0
- mypy/git.py +34 -0
- mypy/graph_utils.py +112 -0
- mypy/indirection.py +121 -0
- mypy/infer.py +75 -0
- mypy/inspections.py +627 -0
- mypy/ipc.py +310 -0
- mypy/join.py +866 -0
- mypy/literals.py +306 -0
- mypy/lookup.py +61 -0
- mypy/main.py +1574 -0
- mypy/maptype.py +106 -0
- mypy/meet.py +1140 -0
- mypy/memprofile.py +121 -0
- mypy/message_registry.py +326 -0
- mypy/messages.py +3171 -0
- mypy/metastore.py +225 -0
- mypy/mixedtraverser.py +112 -0
- mypy/modulefinder.py +875 -0
- mypy/moduleinspect.py +184 -0
- mypy/mro.py +62 -0
- mypy/nodes.py +4112 -0
- mypy/operators.py +126 -0
- mypy/options.py +556 -0
- mypy/parse.py +30 -0
- mypy/partially_defined.py +675 -0
- mypy/patterns.py +150 -0
- mypy/plugin.py +901 -0
- mypy/plugins/__init__.py +0 -0
- mypy/plugins/attrs.py +1152 -0
- mypy/plugins/common.py +440 -0
- mypy/plugins/ctypes.py +245 -0
- mypy/plugins/dataclasses.py +1101 -0
- mypy/plugins/default.py +518 -0
- mypy/plugins/enums.py +259 -0
- mypy/plugins/functools.py +104 -0
- mypy/plugins/proper_plugin.py +175 -0
- mypy/plugins/singledispatch.py +224 -0
- mypy/py.typed +1 -0
- mypy/pyinfo.py +78 -0
- mypy/reachability.py +362 -0
- mypy/refinfo.py +92 -0
- mypy/renaming.py +568 -0
- mypy/report.py +924 -0
- mypy/scope.py +125 -0
- mypy/semanal.py +7023 -0
- mypy/semanal_classprop.py +187 -0
- mypy/semanal_enum.py +253 -0
- mypy/semanal_infer.py +128 -0
- mypy/semanal_main.py +511 -0
- mypy/semanal_namedtuple.py +670 -0
- mypy/semanal_newtype.py +273 -0
- mypy/semanal_pass1.py +156 -0
- mypy/semanal_shared.py +490 -0
- mypy/semanal_typeargs.py +265 -0
- mypy/semanal_typeddict.py +575 -0
- mypy/server/__init__.py +0 -0
- mypy/server/astdiff.py +518 -0
- mypy/server/astmerge.py +562 -0
- mypy/server/aststrip.py +281 -0
- mypy/server/deps.py +1137 -0
- mypy/server/mergecheck.py +83 -0
- mypy/server/objgraph.py +101 -0
- mypy/server/subexpr.py +198 -0
- mypy/server/target.py +11 -0
- mypy/server/trigger.py +26 -0
- mypy/server/update.py +1339 -0
- mypy/sharedparse.py +112 -0
- mypy/solve.py +562 -0
- mypy/split_namespace.py +35 -0
- mypy/state.py +28 -0
- mypy/stats.py +489 -0
- mypy/strconv.py +641 -0
- mypy/stubdoc.py +491 -0
- mypy/stubgen.py +1873 -0
- mypy/stubgenc.py +993 -0
- mypy/stubinfo.py +173 -0
- mypy/stubtest.py +2079 -0
- mypy/stubutil.py +807 -0
- mypy/subtypes.py +1967 -0
- mypy/suggestions.py +1046 -0
- mypy/test/__init__.py +0 -0
- mypy/test/config.py +28 -0
- mypy/test/data.py +823 -0
- mypy/test/helpers.py +476 -0
- mypy/test/meta/__init__.py +0 -0
- mypy/test/meta/_pytest.py +72 -0
- mypy/test/meta/test_diff_helper.py +47 -0
- mypy/test/meta/test_parse_data.py +73 -0
- mypy/test/meta/test_update_data.py +135 -0
- mypy/test/test_find_sources.py +376 -0
- mypy/test/test_ref_info.py +45 -0
- mypy/test/testapi.py +45 -0
- mypy/test/testargs.py +77 -0
- mypy/test/testcheck.py +322 -0
- mypy/test/testcmdline.py +152 -0
- mypy/test/testconstraints.py +134 -0
- mypy/test/testdaemon.py +132 -0
- mypy/test/testdeps.py +77 -0
- mypy/test/testdiff.py +67 -0
- mypy/test/testerrorstream.py +46 -0
- mypy/test/testfinegrained.py +438 -0
- mypy/test/testfinegrainedcache.py +18 -0
- mypy/test/testformatter.py +85 -0
- mypy/test/testfscache.py +101 -0
- mypy/test/testgraph.py +83 -0
- mypy/test/testinfer.py +373 -0
- mypy/test/testipc.py +119 -0
- mypy/test/testmerge.py +238 -0
- mypy/test/testmodulefinder.py +278 -0
- mypy/test/testmypyc.py +14 -0
- mypy/test/testparse.py +107 -0
- mypy/test/testpep561.py +211 -0
- mypy/test/testpythoneval.py +117 -0
- mypy/test/testreports.py +55 -0
- mypy/test/testsemanal.py +209 -0
- mypy/test/testsolve.py +285 -0
- mypy/test/teststubgen.py +1412 -0
- mypy/test/teststubinfo.py +12 -0
- mypy/test/teststubtest.py +2492 -0
- mypy/test/testsubtypes.py +303 -0
- mypy/test/testtransform.py +64 -0
- mypy/test/testtypegen.py +83 -0
- mypy/test/testtypes.py +1551 -0
- mypy/test/testutil.py +111 -0
- mypy/test/typefixture.py +415 -0
- mypy/test/update_data.py +87 -0
- mypy/test/visitors.py +63 -0
- mypy/traverser.py +961 -0
- mypy/treetransform.py +800 -0
- mypy/tvar_scope.py +147 -0
- mypy/type_visitor.py +564 -0
- mypy/typeanal.py +2510 -0
- mypy/typeops.py +1082 -0
- mypy/types.py +3686 -0
- mypy/types_utils.py +166 -0
- mypy/typeshed/LICENSE +237 -0
- mypy/typeshed/stdlib/VERSIONS +308 -0
- mypy/typeshed/stdlib/__future__.pyi +36 -0
- mypy/typeshed/stdlib/__main__.pyi +3 -0
- mypy/typeshed/stdlib/_ast.pyi +587 -0
- mypy/typeshed/stdlib/_bisect.pyi +84 -0
- mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
- mypy/typeshed/stdlib/_codecs.pyi +133 -0
- mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
- mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
- mypy/typeshed/stdlib/_compression.pyi +25 -0
- mypy/typeshed/stdlib/_csv.pyi +90 -0
- mypy/typeshed/stdlib/_ctypes.pyi +205 -0
- mypy/typeshed/stdlib/_curses.pyi +557 -0
- mypy/typeshed/stdlib/_decimal.pyi +281 -0
- mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
- mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
- mypy/typeshed/stdlib/_heapq.pyi +11 -0
- mypy/typeshed/stdlib/_imp.pyi +28 -0
- mypy/typeshed/stdlib/_json.pyi +49 -0
- mypy/typeshed/stdlib/_locale.pyi +100 -0
- mypy/typeshed/stdlib/_markupbase.pyi +16 -0
- mypy/typeshed/stdlib/_msi.pyi +91 -0
- mypy/typeshed/stdlib/_operator.pyi +147 -0
- mypy/typeshed/stdlib/_osx_support.pyi +34 -0
- mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
- mypy/typeshed/stdlib/_py_abc.pyi +14 -0
- mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
- mypy/typeshed/stdlib/_random.pyi +12 -0
- mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
- mypy/typeshed/stdlib/_socket.pyi +802 -0
- mypy/typeshed/stdlib/_stat.pyi +103 -0
- mypy/typeshed/stdlib/_thread.pyi +52 -0
- mypy/typeshed/stdlib/_threading_local.pyi +17 -0
- mypy/typeshed/stdlib/_tkinter.pyi +120 -0
- mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
- mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
- mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
- mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
- mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
- mypy/typeshed/stdlib/_warnings.pyi +55 -0
- mypy/typeshed/stdlib/_weakref.pyi +41 -0
- mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
- mypy/typeshed/stdlib/_winapi.pyi +251 -0
- mypy/typeshed/stdlib/abc.pyi +49 -0
- mypy/typeshed/stdlib/aifc.pyi +91 -0
- mypy/typeshed/stdlib/antigravity.pyi +3 -0
- mypy/typeshed/stdlib/argparse.pyi +571 -0
- mypy/typeshed/stdlib/array.pyi +92 -0
- mypy/typeshed/stdlib/ast.pyi +277 -0
- mypy/typeshed/stdlib/asynchat.pyi +21 -0
- mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
- mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
- mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
- mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
- mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
- mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
- mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
- mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
- mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
- mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
- mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
- mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
- mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
- mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
- mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
- mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
- mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
- mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
- mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
- mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
- mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
- mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
- mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
- mypy/typeshed/stdlib/asyncore.pyi +90 -0
- mypy/typeshed/stdlib/atexit.pyi +12 -0
- mypy/typeshed/stdlib/audioop.pyi +42 -0
- mypy/typeshed/stdlib/base64.pyi +59 -0
- mypy/typeshed/stdlib/bdb.pyi +102 -0
- mypy/typeshed/stdlib/binascii.pyi +36 -0
- mypy/typeshed/stdlib/binhex.pyi +45 -0
- mypy/typeshed/stdlib/bisect.pyi +4 -0
- mypy/typeshed/stdlib/builtins.pyi +1937 -0
- mypy/typeshed/stdlib/bz2.pyi +146 -0
- mypy/typeshed/stdlib/cProfile.pyi +35 -0
- mypy/typeshed/stdlib/calendar.pyi +206 -0
- mypy/typeshed/stdlib/cgi.pyi +118 -0
- mypy/typeshed/stdlib/cgitb.pyi +32 -0
- mypy/typeshed/stdlib/chunk.pyi +20 -0
- mypy/typeshed/stdlib/cmath.pyi +36 -0
- mypy/typeshed/stdlib/cmd.pyi +45 -0
- mypy/typeshed/stdlib/code.pyi +33 -0
- mypy/typeshed/stdlib/codecs.pyi +285 -0
- mypy/typeshed/stdlib/codeop.pyi +13 -0
- mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
- mypy/typeshed/stdlib/collections/abc.pyi +2 -0
- mypy/typeshed/stdlib/colorsys.pyi +13 -0
- mypy/typeshed/stdlib/compileall.pyi +111 -0
- mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
- mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
- mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
- mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
- mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
- mypy/typeshed/stdlib/configparser.pyi +313 -0
- mypy/typeshed/stdlib/contextlib.pyi +207 -0
- mypy/typeshed/stdlib/contextvars.pyi +63 -0
- mypy/typeshed/stdlib/copy.pyi +16 -0
- mypy/typeshed/stdlib/copyreg.pyi +21 -0
- mypy/typeshed/stdlib/crypt.pyi +12 -0
- mypy/typeshed/stdlib/csv.pyi +147 -0
- mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
- mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
- mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
- mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
- mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
- mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
- mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
- mypy/typeshed/stdlib/curses/panel.pyi +25 -0
- mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
- mypy/typeshed/stdlib/dataclasses.pyi +313 -0
- mypy/typeshed/stdlib/datetime.pyi +295 -0
- mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
- mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
- mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
- mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
- mypy/typeshed/stdlib/decimal.pyi +2 -0
- mypy/typeshed/stdlib/difflib.pyi +140 -0
- mypy/typeshed/stdlib/dis.pyi +144 -0
- mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
- mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
- mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
- mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
- mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
- mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
- mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
- mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
- mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
- mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
- mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
- mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
- mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
- mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
- mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
- mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
- mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
- mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
- mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
- mypy/typeshed/stdlib/distutils/config.pyi +17 -0
- mypy/typeshed/stdlib/distutils/core.pyi +57 -0
- mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
- mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
- mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
- mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
- mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
- mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
- mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
- mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
- mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
- mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
- mypy/typeshed/stdlib/distutils/log.pyi +25 -0
- mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
- mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
- mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
- mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/util.pyi +46 -0
- mypy/typeshed/stdlib/distutils/version.pyi +36 -0
- mypy/typeshed/stdlib/doctest.pyi +248 -0
- mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
- mypy/typeshed/stdlib/email/__init__.pyi +29 -0
- mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
- mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
- mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
- mypy/typeshed/stdlib/email/charset.pyi +34 -0
- mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
- mypy/typeshed/stdlib/email/encoders.pyi +8 -0
- mypy/typeshed/stdlib/email/errors.pyi +39 -0
- mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
- mypy/typeshed/stdlib/email/generator.pyi +40 -0
- mypy/typeshed/stdlib/email/header.pyi +31 -0
- mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
- mypy/typeshed/stdlib/email/iterators.pyi +12 -0
- mypy/typeshed/stdlib/email/message.pyi +161 -0
- mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
- mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
- mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
- mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
- mypy/typeshed/stdlib/email/parser.pyi +26 -0
- mypy/typeshed/stdlib/email/policy.pyi +38 -0
- mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
- mypy/typeshed/stdlib/email/utils.pyi +66 -0
- mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
- mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
- mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
- mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
- mypy/typeshed/stdlib/enum.pyi +317 -0
- mypy/typeshed/stdlib/errno.pyi +222 -0
- mypy/typeshed/stdlib/faulthandler.pyi +13 -0
- mypy/typeshed/stdlib/fcntl.pyi +127 -0
- mypy/typeshed/stdlib/filecmp.pyi +57 -0
- mypy/typeshed/stdlib/fileinput.pyi +213 -0
- mypy/typeshed/stdlib/fnmatch.pyi +9 -0
- mypy/typeshed/stdlib/formatter.pyi +88 -0
- mypy/typeshed/stdlib/fractions.pyi +150 -0
- mypy/typeshed/stdlib/ftplib.pyi +178 -0
- mypy/typeshed/stdlib/functools.pyi +200 -0
- mypy/typeshed/stdlib/gc.pyi +37 -0
- mypy/typeshed/stdlib/genericpath.pyi +52 -0
- mypy/typeshed/stdlib/getopt.pyi +11 -0
- mypy/typeshed/stdlib/getpass.pyi +8 -0
- mypy/typeshed/stdlib/gettext.pyi +169 -0
- mypy/typeshed/stdlib/glob.pyi +42 -0
- mypy/typeshed/stdlib/graphlib.pyi +28 -0
- mypy/typeshed/stdlib/grp.pyi +21 -0
- mypy/typeshed/stdlib/gzip.pyi +160 -0
- mypy/typeshed/stdlib/hashlib.pyi +165 -0
- mypy/typeshed/stdlib/heapq.pyi +17 -0
- mypy/typeshed/stdlib/hmac.pyi +38 -0
- mypy/typeshed/stdlib/html/__init__.pyi +6 -0
- mypy/typeshed/stdlib/html/entities.pyi +6 -0
- mypy/typeshed/stdlib/html/parser.pyi +34 -0
- mypy/typeshed/stdlib/http/__init__.pyi +105 -0
- mypy/typeshed/stdlib/http/client.pyi +259 -0
- mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
- mypy/typeshed/stdlib/http/cookies.pyi +60 -0
- mypy/typeshed/stdlib/http/server.pyi +83 -0
- mypy/typeshed/stdlib/imaplib.pyi +168 -0
- mypy/typeshed/stdlib/imghdr.pyi +17 -0
- mypy/typeshed/stdlib/imp.pyi +62 -0
- mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
- mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
- mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
- mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
- mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
- mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
- mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
- mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
- mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
- mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
- mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
- mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
- mypy/typeshed/stdlib/importlib/util.pyi +43 -0
- mypy/typeshed/stdlib/inspect.pyi +631 -0
- mypy/typeshed/stdlib/io.pyi +204 -0
- mypy/typeshed/stdlib/ipaddress.pyi +208 -0
- mypy/typeshed/stdlib/itertools.pyi +293 -0
- mypy/typeshed/stdlib/json/__init__.pyi +61 -0
- mypy/typeshed/stdlib/json/decoder.pyi +32 -0
- mypy/typeshed/stdlib/json/encoder.pyi +38 -0
- mypy/typeshed/stdlib/json/tool.pyi +1 -0
- mypy/typeshed/stdlib/keyword.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
- mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
- mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
- mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
- mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
- mypy/typeshed/stdlib/linecache.pyi +23 -0
- mypy/typeshed/stdlib/locale.pyi +152 -0
- mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
- mypy/typeshed/stdlib/logging/config.pyi +134 -0
- mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
- mypy/typeshed/stdlib/lzma.pyi +197 -0
- mypy/typeshed/stdlib/mailbox.pyi +256 -0
- mypy/typeshed/stdlib/mailcap.pyi +11 -0
- mypy/typeshed/stdlib/marshal.pyi +33 -0
- mypy/typeshed/stdlib/math.pyi +125 -0
- mypy/typeshed/stdlib/mimetypes.pyi +46 -0
- mypy/typeshed/stdlib/mmap.pyi +113 -0
- mypy/typeshed/stdlib/modulefinder.pyi +66 -0
- mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
- mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
- mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
- mypy/typeshed/stdlib/msilib/text.pyi +7 -0
- mypy/typeshed/stdlib/msvcrt.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
- mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
- mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
- mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
- mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
- mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
- mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
- mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
- mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
- mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
- mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
- mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
- mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
- mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
- mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
- mypy/typeshed/stdlib/netrc.pyi +23 -0
- mypy/typeshed/stdlib/nis.pyi +9 -0
- mypy/typeshed/stdlib/nntplib.pyi +125 -0
- mypy/typeshed/stdlib/nt.pyi +111 -0
- mypy/typeshed/stdlib/ntpath.pyi +119 -0
- mypy/typeshed/stdlib/nturl2path.pyi +2 -0
- mypy/typeshed/stdlib/numbers.pyi +154 -0
- mypy/typeshed/stdlib/opcode.pyi +59 -0
- mypy/typeshed/stdlib/operator.pyi +110 -0
- mypy/typeshed/stdlib/optparse.pyi +252 -0
- mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
- mypy/typeshed/stdlib/os/path.pyi +8 -0
- mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
- mypy/typeshed/stdlib/parser.pyi +24 -0
- mypy/typeshed/stdlib/pathlib.pyi +232 -0
- mypy/typeshed/stdlib/pdb.pyi +181 -0
- mypy/typeshed/stdlib/pickle.pyi +270 -0
- mypy/typeshed/stdlib/pickletools.pyi +167 -0
- mypy/typeshed/stdlib/pipes.pyi +16 -0
- mypy/typeshed/stdlib/pkgutil.pyi +53 -0
- mypy/typeshed/stdlib/platform.pyi +42 -0
- mypy/typeshed/stdlib/plistlib.pyi +113 -0
- mypy/typeshed/stdlib/poplib.pyi +71 -0
- mypy/typeshed/stdlib/posix.pyi +359 -0
- mypy/typeshed/stdlib/posixpath.pyi +161 -0
- mypy/typeshed/stdlib/pprint.pyi +112 -0
- mypy/typeshed/stdlib/profile.pyi +31 -0
- mypy/typeshed/stdlib/pstats.pyi +78 -0
- mypy/typeshed/stdlib/pty.pyi +19 -0
- mypy/typeshed/stdlib/pwd.pyi +27 -0
- mypy/typeshed/stdlib/py_compile.pyi +34 -0
- mypy/typeshed/stdlib/pyclbr.pyi +74 -0
- mypy/typeshed/stdlib/pydoc.pyi +261 -0
- mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
- mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
- mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
- mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
- mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
- mypy/typeshed/stdlib/queue.pyi +58 -0
- mypy/typeshed/stdlib/quopri.pyi +11 -0
- mypy/typeshed/stdlib/random.pyi +138 -0
- mypy/typeshed/stdlib/re.pyi +290 -0
- mypy/typeshed/stdlib/readline.pyi +36 -0
- mypy/typeshed/stdlib/reprlib.pyi +65 -0
- mypy/typeshed/stdlib/resource.pyi +92 -0
- mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
- mypy/typeshed/stdlib/runpy.pyi +24 -0
- mypy/typeshed/stdlib/sched.pyi +42 -0
- mypy/typeshed/stdlib/secrets.pyi +15 -0
- mypy/typeshed/stdlib/select.pyi +151 -0
- mypy/typeshed/stdlib/selectors.pyi +67 -0
- mypy/typeshed/stdlib/shelve.pyi +46 -0
- mypy/typeshed/stdlib/shlex.pyi +43 -0
- mypy/typeshed/stdlib/shutil.pyi +189 -0
- mypy/typeshed/stdlib/signal.pyi +189 -0
- mypy/typeshed/stdlib/site.pyi +27 -0
- mypy/typeshed/stdlib/smtpd.pyi +91 -0
- mypy/typeshed/stdlib/smtplib.pyi +204 -0
- mypy/typeshed/stdlib/sndhdr.pyi +14 -0
- mypy/typeshed/stdlib/socket.pyi +825 -0
- mypy/typeshed/stdlib/socketserver.pyi +168 -0
- mypy/typeshed/stdlib/spwd.pyi +40 -0
- mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
- mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
- mypy/typeshed/stdlib/sre_compile.pyi +11 -0
- mypy/typeshed/stdlib/sre_constants.pyi +130 -0
- mypy/typeshed/stdlib/sre_parse.pyi +104 -0
- mypy/typeshed/stdlib/ssl.pyi +529 -0
- mypy/typeshed/stdlib/stat.pyi +1 -0
- mypy/typeshed/stdlib/statistics.pyi +132 -0
- mypy/typeshed/stdlib/string.pyi +83 -0
- mypy/typeshed/stdlib/stringprep.pyi +27 -0
- mypy/typeshed/stdlib/struct.pyi +26 -0
- mypy/typeshed/stdlib/subprocess.pyi +2614 -0
- mypy/typeshed/stdlib/sunau.pyi +86 -0
- mypy/typeshed/stdlib/symbol.pyi +93 -0
- mypy/typeshed/stdlib/symtable.pyi +58 -0
- mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
- mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
- mypy/typeshed/stdlib/sysconfig.pyi +43 -0
- mypy/typeshed/stdlib/syslog.pyi +46 -0
- mypy/typeshed/stdlib/tabnanny.pyi +16 -0
- mypy/typeshed/stdlib/tarfile.pyi +438 -0
- mypy/typeshed/stdlib/telnetlib.pyi +122 -0
- mypy/typeshed/stdlib/tempfile.pyi +477 -0
- mypy/typeshed/stdlib/termios.pyi +267 -0
- mypy/typeshed/stdlib/textwrap.pyi +103 -0
- mypy/typeshed/stdlib/this.pyi +2 -0
- mypy/typeshed/stdlib/threading.pyi +187 -0
- mypy/typeshed/stdlib/time.pyi +107 -0
- mypy/typeshed/stdlib/timeit.pyi +32 -0
- mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
- mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
- mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
- mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
- mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
- mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
- mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
- mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
- mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
- mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
- mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
- mypy/typeshed/stdlib/token.pyi +159 -0
- mypy/typeshed/stdlib/tokenize.pyi +177 -0
- mypy/typeshed/stdlib/tomllib.pyi +10 -0
- mypy/typeshed/stdlib/trace.pyi +79 -0
- mypy/typeshed/stdlib/traceback.pyi +260 -0
- mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
- mypy/typeshed/stdlib/tty.pyi +30 -0
- mypy/typeshed/stdlib/turtle.pyi +713 -0
- mypy/typeshed/stdlib/types.pyi +605 -0
- mypy/typeshed/stdlib/typing.pyi +968 -0
- mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
- mypy/typeshed/stdlib/unicodedata.pyi +71 -0
- mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
- mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
- mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
- mypy/typeshed/stdlib/unittest/case.pyi +342 -0
- mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
- mypy/typeshed/stdlib/unittest/main.pyi +69 -0
- mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
- mypy/typeshed/stdlib/unittest/result.pyi +46 -0
- mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
- mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
- mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
- mypy/typeshed/stdlib/unittest/util.pyi +23 -0
- mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
- mypy/typeshed/stdlib/urllib/error.pyi +23 -0
- mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
- mypy/typeshed/stdlib/urllib/request.pyi +399 -0
- mypy/typeshed/stdlib/urllib/response.pyi +43 -0
- mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
- mypy/typeshed/stdlib/uu.pyi +13 -0
- mypy/typeshed/stdlib/uuid.pyi +100 -0
- mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
- mypy/typeshed/stdlib/warnings.pyi +112 -0
- mypy/typeshed/stdlib/wave.pyi +85 -0
- mypy/typeshed/stdlib/weakref.pyi +150 -0
- mypy/typeshed/stdlib/webbrowser.pyi +74 -0
- mypy/typeshed/stdlib/winreg.pyi +103 -0
- mypy/typeshed/stdlib/winsound.pyi +28 -0
- mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
- mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
- mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
- mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
- mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
- mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
- mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
- mypy/typeshed/stdlib/xdrlib.pyi +57 -0
- mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
- mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
- mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
- mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
- mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
- mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
- mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
- mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
- mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
- mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
- mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
- mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
- mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
- mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
- mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
- mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
- mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
- mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
- mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
- mypy/typeshed/stdlib/xxlimited.pyi +22 -0
- mypy/typeshed/stdlib/zipapp.pyi +20 -0
- mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
- mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
- mypy/typeshed/stdlib/zipimport.pyi +32 -0
- mypy/typeshed/stdlib/zlib.pyi +56 -0
- mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
- mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
- mypy/typestate.py +323 -0
- mypy/typetraverser.py +142 -0
- mypy/typevars.py +93 -0
- mypy/typevartuples.py +32 -0
- mypy/util.py +869 -0
- mypy/version.py +1 -0
- mypy/visitor.py +621 -0
- mypy/xml/mypy-html.css +104 -0
- mypy/xml/mypy-html.xslt +81 -0
- mypy/xml/mypy-txt.xslt +100 -0
- mypy/xml/mypy.xsd +50 -0
- mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
- mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
- mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
- mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
- mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
- mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
- mypyc/README.md +133 -0
- mypyc/__init__.py +0 -0
- mypyc/__main__.py +57 -0
- mypyc/analysis/__init__.py +0 -0
- mypyc/analysis/attrdefined.py +436 -0
- mypyc/analysis/blockfreq.py +32 -0
- mypyc/analysis/dataflow.py +624 -0
- mypyc/analysis/ircheck.py +429 -0
- mypyc/analysis/selfleaks.py +207 -0
- mypyc/build.py +616 -0
- mypyc/codegen/__init__.py +0 -0
- mypyc/codegen/cstring.py +54 -0
- mypyc/codegen/emit.py +1193 -0
- mypyc/codegen/emitclass.py +1060 -0
- mypyc/codegen/emitfunc.py +846 -0
- mypyc/codegen/emitmodule.py +1131 -0
- mypyc/codegen/emitwrapper.py +979 -0
- mypyc/codegen/literals.py +302 -0
- mypyc/common.py +136 -0
- mypyc/crash.py +31 -0
- mypyc/doc/Makefile +20 -0
- mypyc/doc/bool_operations.rst +27 -0
- mypyc/doc/compilation_units.rst +20 -0
- mypyc/doc/conf.py +59 -0
- mypyc/doc/cpython-timings.md +25 -0
- mypyc/doc/dev-intro.md +548 -0
- mypyc/doc/dict_operations.rst +59 -0
- mypyc/doc/differences_from_python.rst +332 -0
- mypyc/doc/float_operations.rst +50 -0
- mypyc/doc/future.md +42 -0
- mypyc/doc/getting_started.rst +240 -0
- mypyc/doc/index.rst +61 -0
- mypyc/doc/int_operations.rst +162 -0
- mypyc/doc/introduction.rst +150 -0
- mypyc/doc/list_operations.rst +65 -0
- mypyc/doc/make.bat +35 -0
- mypyc/doc/native_classes.rst +206 -0
- mypyc/doc/native_operations.rst +55 -0
- mypyc/doc/performance_tips_and_tricks.rst +244 -0
- mypyc/doc/set_operations.rst +47 -0
- mypyc/doc/str_operations.rst +35 -0
- mypyc/doc/tuple_operations.rst +33 -0
- mypyc/doc/using_type_annotations.rst +398 -0
- mypyc/errors.py +29 -0
- mypyc/external/googletest/LICENSE +28 -0
- mypyc/external/googletest/README.md +280 -0
- mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
- mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
- mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
- mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
- mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
- mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
- mypyc/external/googletest/include/gtest/gtest.h +2236 -0
- mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
- mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
- mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
- mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
- mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
- mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
- mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
- mypyc/external/googletest/make/Makefile +61 -0
- mypyc/external/googletest/src/gtest-all.cc +48 -0
- mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
- mypyc/external/googletest/src/gtest-filepath.cc +387 -0
- mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
- mypyc/external/googletest/src/gtest-port.cc +1259 -0
- mypyc/external/googletest/src/gtest-printers.cc +373 -0
- mypyc/external/googletest/src/gtest-test-part.cc +110 -0
- mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
- mypyc/external/googletest/src/gtest.cc +5388 -0
- mypyc/external/googletest/src/gtest_main.cc +38 -0
- mypyc/ir/__init__.py +0 -0
- mypyc/ir/class_ir.py +499 -0
- mypyc/ir/func_ir.py +370 -0
- mypyc/ir/module_ir.py +88 -0
- mypyc/ir/ops.py +1642 -0
- mypyc/ir/pprint.py +496 -0
- mypyc/ir/rtypes.py +1038 -0
- mypyc/irbuild/__init__.py +0 -0
- mypyc/irbuild/ast_helpers.py +120 -0
- mypyc/irbuild/builder.py +1398 -0
- mypyc/irbuild/callable_class.py +173 -0
- mypyc/irbuild/classdef.py +850 -0
- mypyc/irbuild/constant_fold.py +95 -0
- mypyc/irbuild/context.py +186 -0
- mypyc/irbuild/env_class.py +223 -0
- mypyc/irbuild/expression.py +1067 -0
- mypyc/irbuild/for_helpers.py +1046 -0
- mypyc/irbuild/format_str_tokenizer.py +250 -0
- mypyc/irbuild/function.py +1089 -0
- mypyc/irbuild/generator.py +346 -0
- mypyc/irbuild/ll_builder.py +2407 -0
- mypyc/irbuild/main.py +153 -0
- mypyc/irbuild/mapper.py +221 -0
- mypyc/irbuild/match.py +355 -0
- mypyc/irbuild/nonlocalcontrol.py +197 -0
- mypyc/irbuild/prebuildvisitor.py +203 -0
- mypyc/irbuild/prepare.py +609 -0
- mypyc/irbuild/specialize.py +822 -0
- mypyc/irbuild/statement.py +1017 -0
- mypyc/irbuild/targets.py +57 -0
- mypyc/irbuild/util.py +189 -0
- mypyc/irbuild/visitor.py +401 -0
- mypyc/irbuild/vtable.py +82 -0
- mypyc/lib-rt/CPy.h +643 -0
- mypyc/lib-rt/bytes_ops.c +143 -0
- mypyc/lib-rt/dict_ops.c +446 -0
- mypyc/lib-rt/exc_ops.c +259 -0
- mypyc/lib-rt/float_ops.c +192 -0
- mypyc/lib-rt/generic_ops.c +64 -0
- mypyc/lib-rt/getargs.c +450 -0
- mypyc/lib-rt/getargsfast.c +569 -0
- mypyc/lib-rt/init.c +13 -0
- mypyc/lib-rt/int_ops.c +803 -0
- mypyc/lib-rt/list_ops.c +335 -0
- mypyc/lib-rt/misc_ops.c +942 -0
- mypyc/lib-rt/module_shim.tmpl +18 -0
- mypyc/lib-rt/mypyc_util.h +118 -0
- mypyc/lib-rt/pythoncapi_compat.h +497 -0
- mypyc/lib-rt/pythonsupport.h +548 -0
- mypyc/lib-rt/set_ops.c +17 -0
- mypyc/lib-rt/setup.py +70 -0
- mypyc/lib-rt/str_ops.c +241 -0
- mypyc/lib-rt/test_capi.cc +585 -0
- mypyc/lib-rt/tuple_ops.c +61 -0
- mypyc/namegen.py +115 -0
- mypyc/options.py +32 -0
- mypyc/primitives/__init__.py +0 -0
- mypyc/primitives/bytes_ops.py +101 -0
- mypyc/primitives/dict_ops.py +325 -0
- mypyc/primitives/exc_ops.py +101 -0
- mypyc/primitives/float_ops.py +168 -0
- mypyc/primitives/generic_ops.py +384 -0
- mypyc/primitives/int_ops.py +304 -0
- mypyc/primitives/list_ops.py +300 -0
- mypyc/primitives/misc_ops.py +241 -0
- mypyc/primitives/registry.py +323 -0
- mypyc/primitives/set_ops.py +121 -0
- mypyc/primitives/str_ops.py +229 -0
- mypyc/primitives/tuple_ops.py +83 -0
- mypyc/rt_subtype.py +77 -0
- mypyc/sametype.py +83 -0
- mypyc/subtype.py +88 -0
- mypyc/test/__init__.py +0 -0
- mypyc/test/config.py +13 -0
- mypyc/test/test_alwaysdefined.py +46 -0
- mypyc/test/test_analysis.py +77 -0
- mypyc/test/test_cheader.py +45 -0
- mypyc/test/test_commandline.py +82 -0
- mypyc/test/test_emit.py +69 -0
- mypyc/test/test_emitclass.py +35 -0
- mypyc/test/test_emitfunc.py +926 -0
- mypyc/test/test_emitwrapper.py +60 -0
- mypyc/test/test_exceptions.py +56 -0
- mypyc/test/test_external.py +49 -0
- mypyc/test/test_irbuild.py +87 -0
- mypyc/test/test_ircheck.py +199 -0
- mypyc/test/test_literals.py +90 -0
- mypyc/test/test_namegen.py +48 -0
- mypyc/test/test_pprint.py +42 -0
- mypyc/test/test_rarray.py +48 -0
- mypyc/test/test_refcount.py +59 -0
- mypyc/test/test_run.py +426 -0
- mypyc/test/test_serialization.py +108 -0
- mypyc/test/test_struct.py +112 -0
- mypyc/test/test_tuplename.py +33 -0
- mypyc/test/test_typeops.py +97 -0
- mypyc/test/testutil.py +283 -0
- mypyc/test-data/alwaysdefined.test +732 -0
- mypyc/test-data/analysis.test +603 -0
- mypyc/test-data/commandline.test +245 -0
- mypyc/test-data/driver/driver.py +48 -0
- mypyc/test-data/exceptions-freq.test +125 -0
- mypyc/test-data/exceptions.test +713 -0
- mypyc/test-data/fixtures/ir.py +373 -0
- mypyc/test-data/fixtures/testutil.py +103 -0
- mypyc/test-data/fixtures/typing-full.pyi +169 -0
- mypyc/test-data/irbuild-any.test +238 -0
- mypyc/test-data/irbuild-basic.test +3690 -0
- mypyc/test-data/irbuild-bool.test +463 -0
- mypyc/test-data/irbuild-bytes.test +184 -0
- mypyc/test-data/irbuild-classes.test +1303 -0
- mypyc/test-data/irbuild-constant-fold.test +480 -0
- mypyc/test-data/irbuild-dict.test +585 -0
- mypyc/test-data/irbuild-dunders.test +223 -0
- mypyc/test-data/irbuild-float.test +497 -0
- mypyc/test-data/irbuild-generics.test +151 -0
- mypyc/test-data/irbuild-glue-methods.test +437 -0
- mypyc/test-data/irbuild-i16.test +526 -0
- mypyc/test-data/irbuild-i32.test +598 -0
- mypyc/test-data/irbuild-i64.test +2164 -0
- mypyc/test-data/irbuild-int.test +235 -0
- mypyc/test-data/irbuild-isinstance.test +109 -0
- mypyc/test-data/irbuild-lists.test +547 -0
- mypyc/test-data/irbuild-match.test +1708 -0
- mypyc/test-data/irbuild-math.test +64 -0
- mypyc/test-data/irbuild-nested.test +807 -0
- mypyc/test-data/irbuild-optional.test +536 -0
- mypyc/test-data/irbuild-set.test +838 -0
- mypyc/test-data/irbuild-singledispatch.test +257 -0
- mypyc/test-data/irbuild-statements.test +1149 -0
- mypyc/test-data/irbuild-str.test +314 -0
- mypyc/test-data/irbuild-strip-asserts.test +12 -0
- mypyc/test-data/irbuild-try.test +523 -0
- mypyc/test-data/irbuild-tuple.test +462 -0
- mypyc/test-data/irbuild-u8.test +543 -0
- mypyc/test-data/irbuild-unreachable.test +241 -0
- mypyc/test-data/irbuild-vectorcall.test +153 -0
- mypyc/test-data/refcount.test +1588 -0
- mypyc/test-data/run-async.test +145 -0
- mypyc/test-data/run-attrs.test +318 -0
- mypyc/test-data/run-bench.test +196 -0
- mypyc/test-data/run-bools.test +229 -0
- mypyc/test-data/run-bytes.test +302 -0
- mypyc/test-data/run-classes.test +2505 -0
- mypyc/test-data/run-dicts.test +334 -0
- mypyc/test-data/run-dunders.test +945 -0
- mypyc/test-data/run-exceptions.test +448 -0
- mypyc/test-data/run-floats.test +516 -0
- mypyc/test-data/run-functions.test +1310 -0
- mypyc/test-data/run-generators.test +681 -0
- mypyc/test-data/run-i16.test +338 -0
- mypyc/test-data/run-i32.test +336 -0
- mypyc/test-data/run-i64.test +1519 -0
- mypyc/test-data/run-imports.test +265 -0
- mypyc/test-data/run-integers.test +540 -0
- mypyc/test-data/run-lists.test +411 -0
- mypyc/test-data/run-loops.test +485 -0
- mypyc/test-data/run-match.test +283 -0
- mypyc/test-data/run-math.test +106 -0
- mypyc/test-data/run-misc.test +1168 -0
- mypyc/test-data/run-multimodule.test +887 -0
- mypyc/test-data/run-mypy-sim.test +138 -0
- mypyc/test-data/run-primitives.test +375 -0
- mypyc/test-data/run-python37.test +159 -0
- mypyc/test-data/run-python38.test +88 -0
- mypyc/test-data/run-sets.test +150 -0
- mypyc/test-data/run-singledispatch.test +698 -0
- mypyc/test-data/run-strings.test +641 -0
- mypyc/test-data/run-traits.test +411 -0
- mypyc/test-data/run-tuples.test +258 -0
- mypyc/test-data/run-u8.test +303 -0
- mypyc/transform/__init__.py +0 -0
- mypyc/transform/exceptions.py +182 -0
- mypyc/transform/refcount.py +294 -0
- mypyc/transform/uninit.py +190 -0
mypyc/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
mypyc: Mypy to Python C Extension Compiler
|
|
2
|
+
==========================================
|
|
3
|
+
|
|
4
|
+
**NOTE: We are in the process of moving the mypyc README to the**
|
|
5
|
+
**[mypyc repository](https://github.com/mypyc/mypyc)**
|
|
6
|
+
|
|
7
|
+
**This may be out of date!**
|
|
8
|
+
|
|
9
|
+
Mypyc is a compiler that compiles mypy-annotated, statically typed
|
|
10
|
+
Python modules into CPython C extensions. Currently our primary focus
|
|
11
|
+
is on making mypy faster through compilation -- the default mypy wheels
|
|
12
|
+
are compiled with mypyc. Compiled mypy is about 4x faster than
|
|
13
|
+
without compilation.
|
|
14
|
+
|
|
15
|
+
Mypyc compiles what is essentially a Python language variant using "strict"
|
|
16
|
+
semantics. This means (among some other things):
|
|
17
|
+
|
|
18
|
+
* Most type annotations are enforced at runtime (raising ``TypeError`` on mismatch)
|
|
19
|
+
|
|
20
|
+
* Classes are compiled into extension classes without ``__dict__``
|
|
21
|
+
(much, but not quite, like if they used ``__slots__``)
|
|
22
|
+
|
|
23
|
+
* Monkey patching doesn't work
|
|
24
|
+
|
|
25
|
+
* Instance attributes won't fall back to class attributes if undefined
|
|
26
|
+
|
|
27
|
+
* Also there are still a bunch of bad bugs and unsupported features :)
|
|
28
|
+
|
|
29
|
+
Compiled modules can import arbitrary Python modules, and compiled modules
|
|
30
|
+
can be used from other Python modules. Typically mypyc is used to only
|
|
31
|
+
compile modules that contain performance bottlenecks.
|
|
32
|
+
|
|
33
|
+
You can run compiled modules also as normal, interpreted Python
|
|
34
|
+
modules, since mypyc targets valid Python code. This means that
|
|
35
|
+
all Python developer tools and debuggers can be used.
|
|
36
|
+
|
|
37
|
+
macOS Requirements
|
|
38
|
+
------------------
|
|
39
|
+
|
|
40
|
+
* macOS Sierra or later
|
|
41
|
+
|
|
42
|
+
* Xcode command line tools
|
|
43
|
+
|
|
44
|
+
* Python 3.5+ from python.org (other versions are untested)
|
|
45
|
+
|
|
46
|
+
Linux Requirements
|
|
47
|
+
------------------
|
|
48
|
+
|
|
49
|
+
* A recent enough C/C++ build environment
|
|
50
|
+
|
|
51
|
+
* Python 3.5+
|
|
52
|
+
|
|
53
|
+
Windows Requirements
|
|
54
|
+
--------------------
|
|
55
|
+
|
|
56
|
+
* Windows has been tested with Windows 10 and MSVC 2017.
|
|
57
|
+
|
|
58
|
+
* Python 3.5+
|
|
59
|
+
|
|
60
|
+
Quick Start for Contributors
|
|
61
|
+
----------------------------
|
|
62
|
+
|
|
63
|
+
First clone the mypy git repository:
|
|
64
|
+
|
|
65
|
+
$ git clone https://github.com/python/mypy.git
|
|
66
|
+
$ cd mypy
|
|
67
|
+
|
|
68
|
+
Optionally create a virtualenv (recommended):
|
|
69
|
+
|
|
70
|
+
$ python3 -m venv <directory>
|
|
71
|
+
$ source <directory>/bin/activate
|
|
72
|
+
|
|
73
|
+
Then install the dependencies:
|
|
74
|
+
|
|
75
|
+
$ python3 -m pip install -r test-requirements.txt
|
|
76
|
+
|
|
77
|
+
Now you can run the tests:
|
|
78
|
+
|
|
79
|
+
$ pytest -q mypyc
|
|
80
|
+
|
|
81
|
+
Look at the [issue tracker](https://github.com/mypyc/mypyc/issues)
|
|
82
|
+
for things to work on. Please express your interest in working on an
|
|
83
|
+
issue by adding a comment before doing any significant work, since
|
|
84
|
+
there is a risk of duplicate work.
|
|
85
|
+
|
|
86
|
+
Note that the issue tracker is hosted on the mypyc GitHub project, not
|
|
87
|
+
with mypy itself.
|
|
88
|
+
|
|
89
|
+
Documentation
|
|
90
|
+
-------------
|
|
91
|
+
|
|
92
|
+
We have some [developer documentation](doc/dev-intro.md).
|
|
93
|
+
|
|
94
|
+
Development Status and Roadmap
|
|
95
|
+
------------------------------
|
|
96
|
+
|
|
97
|
+
These are the current planned major milestones:
|
|
98
|
+
|
|
99
|
+
1. [DONE] Support a smallish but useful Python subset. Focus on compiling
|
|
100
|
+
single modules, while the rest of the program is interpreted and does not
|
|
101
|
+
need to be type checked.
|
|
102
|
+
|
|
103
|
+
2. [DONE] Support compiling multiple modules as a single compilation unit (or
|
|
104
|
+
dynamic linking of compiled modules). Without this inter-module
|
|
105
|
+
calls will use slower Python-level objects, wrapper functions and
|
|
106
|
+
Python namespaces.
|
|
107
|
+
|
|
108
|
+
3. [DONE] Mypyc can compile mypy.
|
|
109
|
+
|
|
110
|
+
4. [DONE] Optimize some important performance bottlenecks.
|
|
111
|
+
|
|
112
|
+
5. [PARTIALLY DONE] Generate useful errors for code that uses unsupported Python
|
|
113
|
+
features instead of crashing or generating bad code.
|
|
114
|
+
|
|
115
|
+
6. [DONE] Release a version of mypy that includes a compiled mypy.
|
|
116
|
+
|
|
117
|
+
7.
|
|
118
|
+
1. More feature/compatibility work. (100% compatibility with Python is distinctly
|
|
119
|
+
an anti-goal, but more than we have now is a good idea.)
|
|
120
|
+
2. [DONE] Support compiling Black, which is a prominent tool that could benefit
|
|
121
|
+
and has maintainer buy-in.
|
|
122
|
+
(Let us know if you maintain another Python tool or library and are
|
|
123
|
+
interested in working with us on this!)
|
|
124
|
+
3. More optimization! Code size reductions in particular are likely to
|
|
125
|
+
be valuable and will speed up mypyc compilation.
|
|
126
|
+
|
|
127
|
+
8. We'll see! Adventure is out there!
|
|
128
|
+
|
|
129
|
+
Future
|
|
130
|
+
------
|
|
131
|
+
|
|
132
|
+
We have some ideas for
|
|
133
|
+
[future improvements and optimizations](doc/future.md).
|
mypyc/__init__.py
ADDED
|
File without changes
|
mypyc/__main__.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Mypyc command-line tool.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
|
|
5
|
+
$ mypyc foo.py [...]
|
|
6
|
+
$ python3 -c 'import foo' # Uses compiled 'foo'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
This is just a thin wrapper that generates a setup.py file that uses
|
|
10
|
+
mypycify, suitable for prototyping and testing.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import os.path
|
|
17
|
+
import subprocess
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
base_path = os.path.join(os.path.dirname(__file__), "..")
|
|
21
|
+
|
|
22
|
+
setup_format = """\
|
|
23
|
+
from setuptools import setup
|
|
24
|
+
from mypyc.build import mypycify
|
|
25
|
+
|
|
26
|
+
setup(name='mypyc_output',
|
|
27
|
+
ext_modules=mypycify({}, opt_level="{}", debug_level="{}"),
|
|
28
|
+
)
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main() -> None:
|
|
33
|
+
build_dir = "build" # can this be overridden??
|
|
34
|
+
try:
|
|
35
|
+
os.mkdir(build_dir)
|
|
36
|
+
except FileExistsError:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
opt_level = os.getenv("MYPYC_OPT_LEVEL", "3")
|
|
40
|
+
debug_level = os.getenv("MYPYC_DEBUG_LEVEL", "1")
|
|
41
|
+
|
|
42
|
+
setup_file = os.path.join(build_dir, "setup.py")
|
|
43
|
+
with open(setup_file, "w") as f:
|
|
44
|
+
f.write(setup_format.format(sys.argv[1:], opt_level, debug_level))
|
|
45
|
+
|
|
46
|
+
# We don't use run_setup (like we do in the test suite) because it throws
|
|
47
|
+
# away the error code from distutils, and we don't care about the slight
|
|
48
|
+
# performance loss here.
|
|
49
|
+
env = os.environ.copy()
|
|
50
|
+
base_path = os.path.join(os.path.dirname(__file__), "..")
|
|
51
|
+
env["PYTHONPATH"] = base_path + os.pathsep + env.get("PYTHONPATH", "")
|
|
52
|
+
cmd = subprocess.run([sys.executable, setup_file, "build_ext", "--inplace"], env=env)
|
|
53
|
+
sys.exit(cmd.returncode)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
main()
|
|
File without changes
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
"""Always defined attribute analysis.
|
|
2
|
+
|
|
3
|
+
An always defined attribute has some statements in __init__ or the
|
|
4
|
+
class body that cause the attribute to be always initialized when an
|
|
5
|
+
instance is constructed. It must also not be possible to read the
|
|
6
|
+
attribute before initialization, and it can't be deletable.
|
|
7
|
+
|
|
8
|
+
We can assume that the value is always defined when reading an always
|
|
9
|
+
defined attribute. Otherwise we'll need to raise AttributeError if the
|
|
10
|
+
value is undefined (i.e. has the error value).
|
|
11
|
+
|
|
12
|
+
We use data flow analysis to figure out attributes that are always
|
|
13
|
+
defined. Example:
|
|
14
|
+
|
|
15
|
+
class C:
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
self.x = 0
|
|
18
|
+
if func():
|
|
19
|
+
self.y = 1
|
|
20
|
+
else:
|
|
21
|
+
self.y = 2
|
|
22
|
+
self.z = 3
|
|
23
|
+
|
|
24
|
+
In this example, the attributes 'x' and 'y' are always defined, but 'z'
|
|
25
|
+
is not. The analysis assumes that we know that there won't be any subclasses.
|
|
26
|
+
|
|
27
|
+
The analysis also works if there is a known, closed set of subclasses.
|
|
28
|
+
An attribute defined in a base class can only be always defined if it's
|
|
29
|
+
also always defined in all subclasses.
|
|
30
|
+
|
|
31
|
+
As soon as __init__ contains an op that can 'leak' self to another
|
|
32
|
+
function, we will stop inferring always defined attributes, since the
|
|
33
|
+
analysis is mostly intra-procedural and only looks at __init__ methods.
|
|
34
|
+
The called code could read an uninitialized attribute. Example:
|
|
35
|
+
|
|
36
|
+
class C:
|
|
37
|
+
def __init__(self) -> None:
|
|
38
|
+
self.x = self.foo()
|
|
39
|
+
|
|
40
|
+
def foo(self) -> int:
|
|
41
|
+
...
|
|
42
|
+
|
|
43
|
+
Now we won't infer 'x' as always defined, since 'foo' might read 'x'
|
|
44
|
+
before initialization.
|
|
45
|
+
|
|
46
|
+
As an exception to the above limitation, we perform inter-procedural
|
|
47
|
+
analysis of super().__init__ calls, since these are very common.
|
|
48
|
+
|
|
49
|
+
Our analysis is somewhat optimistic. We assume that nobody calls a
|
|
50
|
+
method of a partially uninitialized object through gc.get_objects(), in
|
|
51
|
+
particular. Code like this could potentially cause a segfault with a null
|
|
52
|
+
pointer dereference. This seems very unlikely to be an issue in practice,
|
|
53
|
+
however.
|
|
54
|
+
|
|
55
|
+
Accessing an attribute via getattr always checks for undefined attributes
|
|
56
|
+
and thus works if the object is partially uninitialized. This can be used
|
|
57
|
+
as a workaround if somebody ever needs to inspect partially uninitialized
|
|
58
|
+
objects via gc.get_objects().
|
|
59
|
+
|
|
60
|
+
The analysis runs after IR building as a separate pass. Since we only
|
|
61
|
+
run this on __init__ methods, this analysis pass will be fairly quick.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
from __future__ import annotations
|
|
65
|
+
|
|
66
|
+
from typing import Final, Set, Tuple
|
|
67
|
+
|
|
68
|
+
from mypyc.analysis.dataflow import (
|
|
69
|
+
CFG,
|
|
70
|
+
MAYBE_ANALYSIS,
|
|
71
|
+
AnalysisResult,
|
|
72
|
+
BaseAnalysisVisitor,
|
|
73
|
+
get_cfg,
|
|
74
|
+
run_analysis,
|
|
75
|
+
)
|
|
76
|
+
from mypyc.analysis.selfleaks import analyze_self_leaks
|
|
77
|
+
from mypyc.ir.class_ir import ClassIR
|
|
78
|
+
from mypyc.ir.ops import (
|
|
79
|
+
Assign,
|
|
80
|
+
AssignMulti,
|
|
81
|
+
BasicBlock,
|
|
82
|
+
Branch,
|
|
83
|
+
Call,
|
|
84
|
+
ControlOp,
|
|
85
|
+
GetAttr,
|
|
86
|
+
Register,
|
|
87
|
+
RegisterOp,
|
|
88
|
+
Return,
|
|
89
|
+
SetAttr,
|
|
90
|
+
SetMem,
|
|
91
|
+
Unreachable,
|
|
92
|
+
)
|
|
93
|
+
from mypyc.ir.rtypes import RInstance
|
|
94
|
+
|
|
95
|
+
# If True, print out all always-defined attributes of native classes (to aid
|
|
96
|
+
# debugging and testing)
|
|
97
|
+
dump_always_defined: Final = False
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def analyze_always_defined_attrs(class_irs: list[ClassIR]) -> None:
|
|
101
|
+
"""Find always defined attributes all classes of a compilation unit.
|
|
102
|
+
|
|
103
|
+
Also tag attribute initialization ops to not decref the previous
|
|
104
|
+
value (as this would read a NULL pointer and segfault).
|
|
105
|
+
|
|
106
|
+
Update the _always_initialized_attrs, _sometimes_initialized_attrs
|
|
107
|
+
and init_self_leak attributes in ClassIR instances.
|
|
108
|
+
|
|
109
|
+
This is the main entry point.
|
|
110
|
+
"""
|
|
111
|
+
seen: set[ClassIR] = set()
|
|
112
|
+
|
|
113
|
+
# First pass: only look at target class and classes in MRO
|
|
114
|
+
for cl in class_irs:
|
|
115
|
+
analyze_always_defined_attrs_in_class(cl, seen)
|
|
116
|
+
|
|
117
|
+
# Second pass: look at all derived class
|
|
118
|
+
seen = set()
|
|
119
|
+
for cl in class_irs:
|
|
120
|
+
update_always_defined_attrs_using_subclasses(cl, seen)
|
|
121
|
+
|
|
122
|
+
# Final pass: detect attributes that need to use a bitmap to track definedness
|
|
123
|
+
seen = set()
|
|
124
|
+
for cl in class_irs:
|
|
125
|
+
detect_undefined_bitmap(cl, seen)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def analyze_always_defined_attrs_in_class(cl: ClassIR, seen: set[ClassIR]) -> None:
|
|
129
|
+
if cl in seen:
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
seen.add(cl)
|
|
133
|
+
|
|
134
|
+
if (
|
|
135
|
+
cl.is_trait
|
|
136
|
+
or cl.inherits_python
|
|
137
|
+
or cl.allow_interpreted_subclasses
|
|
138
|
+
or cl.builtin_base is not None
|
|
139
|
+
or cl.children is None
|
|
140
|
+
or cl.is_serializable()
|
|
141
|
+
):
|
|
142
|
+
# Give up -- we can't enforce that attributes are always defined.
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
# First analyze all base classes. Track seen classes to avoid duplicate work.
|
|
146
|
+
for base in cl.mro[1:]:
|
|
147
|
+
analyze_always_defined_attrs_in_class(base, seen)
|
|
148
|
+
|
|
149
|
+
m = cl.get_method("__init__")
|
|
150
|
+
if m is None:
|
|
151
|
+
cl._always_initialized_attrs = cl.attrs_with_defaults.copy()
|
|
152
|
+
cl._sometimes_initialized_attrs = cl.attrs_with_defaults.copy()
|
|
153
|
+
return
|
|
154
|
+
self_reg = m.arg_regs[0]
|
|
155
|
+
cfg = get_cfg(m.blocks)
|
|
156
|
+
dirty = analyze_self_leaks(m.blocks, self_reg, cfg)
|
|
157
|
+
maybe_defined = analyze_maybe_defined_attrs_in_init(
|
|
158
|
+
m.blocks, self_reg, cl.attrs_with_defaults, cfg
|
|
159
|
+
)
|
|
160
|
+
all_attrs: set[str] = set()
|
|
161
|
+
for base in cl.mro:
|
|
162
|
+
all_attrs.update(base.attributes)
|
|
163
|
+
maybe_undefined = analyze_maybe_undefined_attrs_in_init(
|
|
164
|
+
m.blocks, self_reg, initial_undefined=all_attrs - cl.attrs_with_defaults, cfg=cfg
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
always_defined = find_always_defined_attributes(
|
|
168
|
+
m.blocks, self_reg, all_attrs, maybe_defined, maybe_undefined, dirty
|
|
169
|
+
)
|
|
170
|
+
always_defined = {a for a in always_defined if not cl.is_deletable(a)}
|
|
171
|
+
|
|
172
|
+
cl._always_initialized_attrs = always_defined
|
|
173
|
+
if dump_always_defined:
|
|
174
|
+
print(cl.name, sorted(always_defined))
|
|
175
|
+
cl._sometimes_initialized_attrs = find_sometimes_defined_attributes(
|
|
176
|
+
m.blocks, self_reg, maybe_defined, dirty
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
mark_attr_initialiation_ops(m.blocks, self_reg, maybe_defined, dirty)
|
|
180
|
+
|
|
181
|
+
# Check if __init__ can run unpredictable code (leak 'self').
|
|
182
|
+
any_dirty = False
|
|
183
|
+
for b in m.blocks:
|
|
184
|
+
for i, op in enumerate(b.ops):
|
|
185
|
+
if dirty.after[b, i] and not isinstance(op, Return):
|
|
186
|
+
any_dirty = True
|
|
187
|
+
break
|
|
188
|
+
cl.init_self_leak = any_dirty
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def find_always_defined_attributes(
|
|
192
|
+
blocks: list[BasicBlock],
|
|
193
|
+
self_reg: Register,
|
|
194
|
+
all_attrs: set[str],
|
|
195
|
+
maybe_defined: AnalysisResult[str],
|
|
196
|
+
maybe_undefined: AnalysisResult[str],
|
|
197
|
+
dirty: AnalysisResult[None],
|
|
198
|
+
) -> set[str]:
|
|
199
|
+
"""Find attributes that are always initialized in some basic blocks.
|
|
200
|
+
|
|
201
|
+
The analysis results are expected to be up-to-date for the blocks.
|
|
202
|
+
|
|
203
|
+
Return a set of always defined attributes.
|
|
204
|
+
"""
|
|
205
|
+
attrs = all_attrs.copy()
|
|
206
|
+
for block in blocks:
|
|
207
|
+
for i, op in enumerate(block.ops):
|
|
208
|
+
# If an attribute we *read* may be undefined, it isn't always defined.
|
|
209
|
+
if isinstance(op, GetAttr) and op.obj is self_reg:
|
|
210
|
+
if op.attr in maybe_undefined.before[block, i]:
|
|
211
|
+
attrs.discard(op.attr)
|
|
212
|
+
# If an attribute we *set* may be sometimes undefined and
|
|
213
|
+
# sometimes defined, don't consider it always defined. Unlike
|
|
214
|
+
# the get case, it's fine for the attribute to be undefined.
|
|
215
|
+
# The set operation will then be treated as initialization.
|
|
216
|
+
if isinstance(op, SetAttr) and op.obj is self_reg:
|
|
217
|
+
if (
|
|
218
|
+
op.attr in maybe_undefined.before[block, i]
|
|
219
|
+
and op.attr in maybe_defined.before[block, i]
|
|
220
|
+
):
|
|
221
|
+
attrs.discard(op.attr)
|
|
222
|
+
# Treat an op that might run arbitrary code as an "exit"
|
|
223
|
+
# in terms of the analysis -- we can't do any inference
|
|
224
|
+
# afterwards reliably.
|
|
225
|
+
if dirty.after[block, i]:
|
|
226
|
+
if not dirty.before[block, i]:
|
|
227
|
+
attrs = attrs & (
|
|
228
|
+
maybe_defined.after[block, i] - maybe_undefined.after[block, i]
|
|
229
|
+
)
|
|
230
|
+
break
|
|
231
|
+
if isinstance(op, ControlOp):
|
|
232
|
+
for target in op.targets():
|
|
233
|
+
# Gotos/branches can also be "exits".
|
|
234
|
+
if not dirty.after[block, i] and dirty.before[target, 0]:
|
|
235
|
+
attrs = attrs & (
|
|
236
|
+
maybe_defined.after[target, 0] - maybe_undefined.after[target, 0]
|
|
237
|
+
)
|
|
238
|
+
return attrs
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def find_sometimes_defined_attributes(
|
|
242
|
+
blocks: list[BasicBlock],
|
|
243
|
+
self_reg: Register,
|
|
244
|
+
maybe_defined: AnalysisResult[str],
|
|
245
|
+
dirty: AnalysisResult[None],
|
|
246
|
+
) -> set[str]:
|
|
247
|
+
"""Find attributes that are sometimes initialized in some basic blocks."""
|
|
248
|
+
attrs: set[str] = set()
|
|
249
|
+
for block in blocks:
|
|
250
|
+
for i, op in enumerate(block.ops):
|
|
251
|
+
# Only look at possibly defined attributes at exits.
|
|
252
|
+
if dirty.after[block, i]:
|
|
253
|
+
if not dirty.before[block, i]:
|
|
254
|
+
attrs = attrs | maybe_defined.after[block, i]
|
|
255
|
+
break
|
|
256
|
+
if isinstance(op, ControlOp):
|
|
257
|
+
for target in op.targets():
|
|
258
|
+
if not dirty.after[block, i] and dirty.before[target, 0]:
|
|
259
|
+
attrs = attrs | maybe_defined.after[target, 0]
|
|
260
|
+
return attrs
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def mark_attr_initialiation_ops(
|
|
264
|
+
blocks: list[BasicBlock],
|
|
265
|
+
self_reg: Register,
|
|
266
|
+
maybe_defined: AnalysisResult[str],
|
|
267
|
+
dirty: AnalysisResult[None],
|
|
268
|
+
) -> None:
|
|
269
|
+
"""Tag all SetAttr ops in the basic blocks that initialize attributes.
|
|
270
|
+
|
|
271
|
+
Initialization ops assume that the previous attribute value is the error value,
|
|
272
|
+
so there's no need to decref or check for definedness.
|
|
273
|
+
"""
|
|
274
|
+
for block in blocks:
|
|
275
|
+
for i, op in enumerate(block.ops):
|
|
276
|
+
if isinstance(op, SetAttr) and op.obj is self_reg:
|
|
277
|
+
attr = op.attr
|
|
278
|
+
if attr not in maybe_defined.before[block, i] and not dirty.after[block, i]:
|
|
279
|
+
op.mark_as_initializer()
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
GenAndKill = Tuple[Set[str], Set[str]]
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def attributes_initialized_by_init_call(op: Call) -> set[str]:
|
|
286
|
+
"""Calculate attributes that are always initialized by a super().__init__ call."""
|
|
287
|
+
self_type = op.fn.sig.args[0].type
|
|
288
|
+
assert isinstance(self_type, RInstance)
|
|
289
|
+
cl = self_type.class_ir
|
|
290
|
+
return {a for base in cl.mro for a in base.attributes if base.is_always_defined(a)}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def attributes_maybe_initialized_by_init_call(op: Call) -> set[str]:
|
|
294
|
+
"""Calculate attributes that may be initialized by a super().__init__ call."""
|
|
295
|
+
self_type = op.fn.sig.args[0].type
|
|
296
|
+
assert isinstance(self_type, RInstance)
|
|
297
|
+
cl = self_type.class_ir
|
|
298
|
+
return attributes_initialized_by_init_call(op) | cl._sometimes_initialized_attrs
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class AttributeMaybeDefinedVisitor(BaseAnalysisVisitor[str]):
|
|
302
|
+
"""Find attributes that may have been defined via some code path.
|
|
303
|
+
|
|
304
|
+
Consider initializations in class body and assignments to 'self.x'
|
|
305
|
+
and calls to base class '__init__'.
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
def __init__(self, self_reg: Register) -> None:
|
|
309
|
+
self.self_reg = self_reg
|
|
310
|
+
|
|
311
|
+
def visit_branch(self, op: Branch) -> tuple[set[str], set[str]]:
|
|
312
|
+
return set(), set()
|
|
313
|
+
|
|
314
|
+
def visit_return(self, op: Return) -> tuple[set[str], set[str]]:
|
|
315
|
+
return set(), set()
|
|
316
|
+
|
|
317
|
+
def visit_unreachable(self, op: Unreachable) -> tuple[set[str], set[str]]:
|
|
318
|
+
return set(), set()
|
|
319
|
+
|
|
320
|
+
def visit_register_op(self, op: RegisterOp) -> tuple[set[str], set[str]]:
|
|
321
|
+
if isinstance(op, SetAttr) and op.obj is self.self_reg:
|
|
322
|
+
return {op.attr}, set()
|
|
323
|
+
if isinstance(op, Call) and op.fn.class_name and op.fn.name == "__init__":
|
|
324
|
+
return attributes_maybe_initialized_by_init_call(op), set()
|
|
325
|
+
return set(), set()
|
|
326
|
+
|
|
327
|
+
def visit_assign(self, op: Assign) -> tuple[set[str], set[str]]:
|
|
328
|
+
return set(), set()
|
|
329
|
+
|
|
330
|
+
def visit_assign_multi(self, op: AssignMulti) -> tuple[set[str], set[str]]:
|
|
331
|
+
return set(), set()
|
|
332
|
+
|
|
333
|
+
def visit_set_mem(self, op: SetMem) -> tuple[set[str], set[str]]:
|
|
334
|
+
return set(), set()
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def analyze_maybe_defined_attrs_in_init(
|
|
338
|
+
blocks: list[BasicBlock], self_reg: Register, attrs_with_defaults: set[str], cfg: CFG
|
|
339
|
+
) -> AnalysisResult[str]:
|
|
340
|
+
return run_analysis(
|
|
341
|
+
blocks=blocks,
|
|
342
|
+
cfg=cfg,
|
|
343
|
+
gen_and_kill=AttributeMaybeDefinedVisitor(self_reg),
|
|
344
|
+
initial=attrs_with_defaults,
|
|
345
|
+
backward=False,
|
|
346
|
+
kind=MAYBE_ANALYSIS,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
class AttributeMaybeUndefinedVisitor(BaseAnalysisVisitor[str]):
|
|
351
|
+
"""Find attributes that may be undefined via some code path.
|
|
352
|
+
|
|
353
|
+
Consider initializations in class body, assignments to 'self.x'
|
|
354
|
+
and calls to base class '__init__'.
|
|
355
|
+
"""
|
|
356
|
+
|
|
357
|
+
def __init__(self, self_reg: Register) -> None:
|
|
358
|
+
self.self_reg = self_reg
|
|
359
|
+
|
|
360
|
+
def visit_branch(self, op: Branch) -> tuple[set[str], set[str]]:
|
|
361
|
+
return set(), set()
|
|
362
|
+
|
|
363
|
+
def visit_return(self, op: Return) -> tuple[set[str], set[str]]:
|
|
364
|
+
return set(), set()
|
|
365
|
+
|
|
366
|
+
def visit_unreachable(self, op: Unreachable) -> tuple[set[str], set[str]]:
|
|
367
|
+
return set(), set()
|
|
368
|
+
|
|
369
|
+
def visit_register_op(self, op: RegisterOp) -> tuple[set[str], set[str]]:
|
|
370
|
+
if isinstance(op, SetAttr) and op.obj is self.self_reg:
|
|
371
|
+
return set(), {op.attr}
|
|
372
|
+
if isinstance(op, Call) and op.fn.class_name and op.fn.name == "__init__":
|
|
373
|
+
return set(), attributes_initialized_by_init_call(op)
|
|
374
|
+
return set(), set()
|
|
375
|
+
|
|
376
|
+
def visit_assign(self, op: Assign) -> tuple[set[str], set[str]]:
|
|
377
|
+
return set(), set()
|
|
378
|
+
|
|
379
|
+
def visit_assign_multi(self, op: AssignMulti) -> tuple[set[str], set[str]]:
|
|
380
|
+
return set(), set()
|
|
381
|
+
|
|
382
|
+
def visit_set_mem(self, op: SetMem) -> tuple[set[str], set[str]]:
|
|
383
|
+
return set(), set()
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def analyze_maybe_undefined_attrs_in_init(
|
|
387
|
+
blocks: list[BasicBlock], self_reg: Register, initial_undefined: set[str], cfg: CFG
|
|
388
|
+
) -> AnalysisResult[str]:
|
|
389
|
+
return run_analysis(
|
|
390
|
+
blocks=blocks,
|
|
391
|
+
cfg=cfg,
|
|
392
|
+
gen_and_kill=AttributeMaybeUndefinedVisitor(self_reg),
|
|
393
|
+
initial=initial_undefined,
|
|
394
|
+
backward=False,
|
|
395
|
+
kind=MAYBE_ANALYSIS,
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def update_always_defined_attrs_using_subclasses(cl: ClassIR, seen: set[ClassIR]) -> None:
|
|
400
|
+
"""Remove attributes not defined in all subclasses from always defined attrs."""
|
|
401
|
+
if cl in seen:
|
|
402
|
+
return
|
|
403
|
+
if cl.children is None:
|
|
404
|
+
# Subclasses are unknown
|
|
405
|
+
return
|
|
406
|
+
removed = set()
|
|
407
|
+
for attr in cl._always_initialized_attrs:
|
|
408
|
+
for child in cl.children:
|
|
409
|
+
update_always_defined_attrs_using_subclasses(child, seen)
|
|
410
|
+
if attr not in child._always_initialized_attrs:
|
|
411
|
+
removed.add(attr)
|
|
412
|
+
cl._always_initialized_attrs -= removed
|
|
413
|
+
seen.add(cl)
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
def detect_undefined_bitmap(cl: ClassIR, seen: set[ClassIR]) -> None:
|
|
417
|
+
if cl.is_trait:
|
|
418
|
+
return
|
|
419
|
+
|
|
420
|
+
if cl in seen:
|
|
421
|
+
return
|
|
422
|
+
seen.add(cl)
|
|
423
|
+
for base in cl.base_mro[1:]:
|
|
424
|
+
detect_undefined_bitmap(cl, seen)
|
|
425
|
+
|
|
426
|
+
if len(cl.base_mro) > 1:
|
|
427
|
+
cl.bitmap_attrs.extend(cl.base_mro[1].bitmap_attrs)
|
|
428
|
+
for n, t in cl.attributes.items():
|
|
429
|
+
if t.error_overlap and not cl.is_always_defined(n):
|
|
430
|
+
cl.bitmap_attrs.append(n)
|
|
431
|
+
|
|
432
|
+
for base in cl.mro[1:]:
|
|
433
|
+
if base.is_trait:
|
|
434
|
+
for n, t in base.attributes.items():
|
|
435
|
+
if t.error_overlap and not cl.is_always_defined(n) and n not in cl.bitmap_attrs:
|
|
436
|
+
cl.bitmap_attrs.append(n)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Find basic blocks that are likely to be executed frequently.
|
|
2
|
+
|
|
3
|
+
For example, this would not include blocks that have exception handlers.
|
|
4
|
+
|
|
5
|
+
We can use different optimization heuristics for common and rare code. For
|
|
6
|
+
example, we can make IR fast to compile instead of fast to execute for rare
|
|
7
|
+
code.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from mypyc.ir.ops import BasicBlock, Branch, Goto
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def frequently_executed_blocks(entry_point: BasicBlock) -> set[BasicBlock]:
|
|
16
|
+
result: set[BasicBlock] = set()
|
|
17
|
+
worklist = [entry_point]
|
|
18
|
+
while worklist:
|
|
19
|
+
block = worklist.pop()
|
|
20
|
+
if block in result:
|
|
21
|
+
continue
|
|
22
|
+
result.add(block)
|
|
23
|
+
t = block.terminator
|
|
24
|
+
if isinstance(t, Goto):
|
|
25
|
+
worklist.append(t.label)
|
|
26
|
+
elif isinstance(t, Branch):
|
|
27
|
+
if t.rare or t.traceback_entry is not None:
|
|
28
|
+
worklist.append(t.false)
|
|
29
|
+
else:
|
|
30
|
+
worklist.append(t.true)
|
|
31
|
+
worklist.append(t.false)
|
|
32
|
+
return result
|